https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
읽어보니 입력 값도 적고 해서 그냥 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으로 넘겨주니 잘 해결됐다.
골드가 얼마 남지 않았다!
[백준/파이썬]5525 IOIOI (0) | 2023.06.19 |
---|---|
[백준/파이썬]1927 최소 힙 (0) | 2023.06.18 |
[백준/파이썬]1541 잃어버린 괄호 (0) | 2023.06.09 |
[백준/파이썬]1463 1로 만들기 (1) | 2023.06.09 |
[백준/파이썬]15650 N과 M(2) (0) | 2023.06.08 |