또 뭐하지

백준 1018번 체스판 다시 칠하기 본문

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 중 가장 작은 값을 출력

 

다른 코드들도 살펴봤는데 하나하나 비교하는 코드 말고는 이해가 안됨.. ㅠ

'Study > Coding Test' 카테고리의 다른 글

백준 2164번 카드2  (0) 2024.11.22
백준 1920번 수 찾기  (0) 2024.11.21
백준 11650번 좌표 정렬하기  (0) 2024.11.21
백준 10814번 나이순 정렬  (0) 2024.11.20
백준 7568번 덩치  (0) 2024.11.20