#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; const int MAX = 20 + 2; const int INF = 987654321; int result = INF; int N; int coins[MAX]; void func(int idx) { if (idx == N) { int sum = 0; // 행을 뒤집을지 여부 파악 for (int i = 1; i < (1 << N); i *= 2) { int temp = 0; for (int j = 0; j < N; j++) { if (i & coins[j]) { temp++; } } sum += min(temp, N - temp); } result = min(result, sum); return; } // 열을 뒤집는 경우와 뒤집지 않는 경우 모두 살펴봐야 함 func(idx + 1); coins[idx] = ~coins[idx]; // 비트마스킹 기법을 이용하면 간단히 뒤집을 수 있음 func(idx + 1); } int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; // 주어진 문자열을 T를 기준으로 생성한 비트로 대체 for (int i = 0; i < N; i++) { string s; cin >> s; int bit = 1; for (int j = 0; j < N; j++) { if (s[j] == 'T') { coins[i] |= bit; } bit *= 2; } } func(0); cout << result << "\n"; return 0; }