상세 컨텐츠

본문 제목

[백준/파이썬]1018 체스판 다시 칠하기

알고리즘 문제풀이

by 한백인데용 2023. 6. 16. 18:29

본문

728x90
반응형

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

1018 체스판 다시 칠하기 제출 결과

문제

읽어보니 입력 값도 적고 해서 그냥 for문 왕창 돌려서 모든 경우의 체스판을 전부 만들고, 올바른 체스판과 비교하면 될 거 같았다.

 

정답

def chess_check(slice_chess) :
    change_count_w = 0
    change_count_b = 0
    CHESS_W = ['WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW']
    for row in range(8) :
        for col in range(8) :
            if slice_chess[row][col] != CHESS_W[row][col] :
                change_count_w += 1

    CHESS_B = ['BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',
            'BWBWBWBW',
            'WBWBWBWB',]
    for row in range(8) :
        for col in range(8) :
            if slice_chess[row][col] != CHESS_B[row][col] :
                change_count_b += 1
    
    return min(change_count_w, change_count_b)

N, M = map(int, input().split())
all_chess = [None for i in range(N)]

for i in range(N) :
    all_chess[i] = input()

min_num = 9999

set_row = N-7
set_col = M-7

for i in range(set_row) :
    for j in range(set_col) :
        slice_chess = []
        for k in range(8) :
            slice_chess.append(all_chess[i+k][j:j+8])
        
        change_num = chess_check(slice_chess)
        
        if change_num < min_num :
            min_num = change_num
print(min_num)

 

풀이를 하자면

 

입력받은 체스판에서 모든 경우의 8*8 체스판으로 만든 후 chess_check함수로 넘겨준다.

 

넘겨준 뒤, 바뀌는 체스판을 카운팅 해주고 카운팅 한 결과를 return 해준다.

 

여기서 함정이라고 생각되는 게

 

문제에 보면

 

이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

 

이런 말이 있길래

 

slice_chess의 [0][0] 번째만 비교해서 각각에 맞는 체스판과 비교하니 예제 입력 4에서 막혔다.

 

9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW

이게 예제 입력 4인데

 

잘 보면 제일 오른쪽 밑에 W가 있다.

 

그래서 그냥 [0][0]이 W인지 B인지의 경우를 나누지 않고 그냥 둘 다 카운팅 한 후 더 작은 값을 return으로 넘겨주니 잘 해결됐다.

 


골드가 얼마 남지 않았다!

728x90
반응형

관련글 더보기