combinations 메소드를 활용해서도 구현할 수 있다..
2X2X2개의 경우의 수를 고려해줘야 한다.for case in range(2**N)board_temp = []case가 7, 즉 111이라면 모든 행을 뒤집어야 한다. 그런데 이를 어떻게 판단할 것인가?1인지 아닌지를 판단하면 된다.1부터 시작하여 행의 개수만큼 1의 비트를 왼쪽으로 이동시키며 각 자리수가 1인지 아닌지를 확인한다.if case & (1 << i)101 & 001은 참(001)이므로 0번째 행을 뒤집는다.101 & 010은 거짓(000)이므로 1번째 행은 뒤집지 않는다.101 & 100은 참(100)이므로 2번째 행을 뒤집는다.board_reversed[i]을 board_temp에 append하고, 거짓이면 board[i]를 append한다.board_temp 배열을 활용하여, 열을 뒤집고 T의 개수를 센다.total_count에 더해준다.total_count을 answer값과 비교하여 더 작은 값으로 answer을 업데이트해준다.최종 제출 코드
import sys
input = sys.stdin.readline
N = int(input())
board = [list(map(str, input().rstrip())) for _ in range(N)]
answer = N*N
# 이걸 미리 만들어두면 행 뒤집기 시 매번 리스트를 확인하고 반전시켜줄 필요가 없다
board_reversed = [["H"] * N for _ in range(N)]
for i in range(N):
for j in range(N):
if board_reversed[i][j] == board[i][j]:
board_reversed[i][j] = "T"
for case in range( 2**N ):
board_temp = []
for i in range(N):
if case & (1 << i):
board_temp.append(board_reversed[i])
else:
board_temp.append(board[i])
total_count = 0
for j in range(N):
count = 0
for i in range(N):
if board_temp[i][j] == "T":
count += 1
total_count += min(count, N-count)
answer = min(answer, total_count)
print(answer)
0~N),for i in range(N+1)N중에서 i개(뒤집을 행의 개수)를 골라 조합을 생성(뒤집을 행의 조합)한다.for rows in combinations(range(N), i)for i in range(N+1):
for rows in combinations(range(N), i):
board_temp = []
for j in range(N):
if j in rows:
board_temp.append(board_reversed[j])
else:
board_temp.append(board[j])
