Study/Coding Test
백준 1018번 체스판 다시 칠하기
mameul
2024. 11. 21. 23:44
728x90
진짜.. 오래걸렸다.
숫자로 변환해서 푸는 문제도 고민해봤는데 실패하고, 하나하나 비교하는 코드를 짜자니 막막했다.
문제에서 '이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다'라는 부분을 힌트 삼아서 풀었다.
먼저 가능한 두 가지 경우의 2차원 배열을 미리 저장해두고,
입력받은 문자열을 2차원 배열로 받아와서,
8*8 크기로 잘라가면서 위의 가능한 두 가지 경우에 대해서 비교를 하였다.
각 경우별로 다른 원소의 개수를 세어 result 배열에 저장해둔 후 제일 작은 값을 출력하는 방식으로 답을 얻었다.
N, M = map(int, input().split())
board = []
case1 = [['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B']]
case2 = [['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W']]
for _ in range(N):
board.append(list(input()[:M]))
result = []
for i in range(N - 7):
for j in range(M - 7):
tmp = [row[j:j + 8] for row in board[i:i + 8]] # 입력받은 보드를 8*8 크기로 자름
cnt1 = 0
cnt2 = 0
for p in range(8):
for q in range(8):
if tmp[p][q] != case1[p][q]: # case1과 비교
cnt1 += 1
if tmp[p][q] != case2[p][q]: # case2과 비교
cnt2 += 1
result.append(cnt1)
result.append(cnt2)
print(min(result)) # 가능한 result 중 가장 작은 값을 출력
다른 코드들도 살펴봤는데 하나하나 비교하는 코드 말고는 이해가 안됨.. ㅠ