백준 1018번: 체스판 다시 칠하기 - 실버 5

Minhee kang·2021년 9월 22일
0

문제 보러 가기 👈

💡 풀이

✔ 풀이 방법1

첫 번째 칸이 검은색인 체스판 chess_B, 첫 번째 칸이 흰색인 체스판 chess_W을 만들어서 일치 여부를 판별한다.

N, M = map(int, input().split())
board = [list(input()) for _ in range(N)]

chess_B = [['B' if not (i % 2) else 'W' for i in range(8)] if not (j % 2) else ['W' if not (i % 2) else 'B' for i in range(8)] for j in range(8)]
chess_W = [['W' if not (i % 2) else 'B' for i in range(8)] if not (j % 2) else ['B' if not (i % 2) else 'W' for i in range(8)] for j in range(8)]

cnt = float('inf')
for i_start in range(N - 7):
    for j_start in range(M - 7):
        cnt_B, cnt_W = 0, 0
        for i in range(i_start, i_start + 8):
            for j in range(j_start, j_start + 8):
                if board[i][j] != chess_B[i - i_start][j - j_start]:
                    cnt_B += 1
                if board[i][j] != chess_W[i - i_start][j - j_start]:
                    cnt_W += 1
        cnt = min(cnt, min(cnt_B, cnt_W))

print(cnt)

✔ 풀이 방법2

현재 위치의 행과 열을 더했을 때 짝수이면 첫 번째 칸과 같은 색 이어야 하고, 홀수이면 첫 번째 칸과 다른 색 이여야 체스판을 만족한다.

N, M = map(int, input().split())
board = [list(input()) for _ in range(N)]

cnt = float('inf')
for i_start in range(N - 7):
    for j_start in range(M - 7):
        cnt_B, cnt_W = 0, 0
        for i in range(i_start, i_start + 8):
            for j in range(j_start, j_start + 8):
                if (i + j) % 2:  #행과 열의 합이 홀수 일 경우
                    if board[i][j] == 'B':
                        cnt_B += 1
                    else:
                        cnt_W += 1
                else:    #행과 열의 합이 짝수 일 경우
                    if board[i][j] == 'B':
                        cnt_W += 1
                    else:
                        cnt_B += 1
        cnt = min(cnt, min(cnt_B, cnt_W))

print(cnt)

0개의 댓글