Coding Test/백준
[백준 1018번] 체스판 다시 칠하기
Lucian_Cho
2021. 2. 28. 19:29
# 문제
내 풀이 - 문제 풀이 실패, 수정 답안
# 첫 칸을 검은색, 흰색 각각으로 칠할 때, 둘 중 다시 칠해야 하는 횟수가 최소인 값을 리턴하는 함수 정의
def paint_board(chess_board):
# 첫 칸이 검은색일 경우와 흰색일 경우, 각각 다시 칠하는 횟수
start_b, start_w = 0, 0
for i in range(8):
for j in range(8):
if (i + j) % 2 == 0:
if chess_board[i][j] != 'B':
start_b += 1
if chess_board[i][j] != 'W':
start_w += 1
else:
if chess_board[i][j] != 'W':
start_b += 1
if chess_board[i][j] != 'B':
start_w += 1
min_val = min(start_b, start_w)
return min_val
n, m = map(int, input().split())
board = [list(input()) for _ in range(n)] # MN 보드 입력 받기
result = int(10e9) # 다시 칠하는 최소 횟수
# 각각의 체스판 중 가장 최소인 값 탐색
for i in range(n - 7):
for j in range(m - 7):
# 8 X 8 체스판 크기로 보드를 slicing
chess_board = [row[j:j+8] for row in board[i:i+8]]
min_paint_cnt = paint_board(chess_board)
# 현재 체스판의 값이 최소면, 최소값 갱신
result = min(result, min_paint_cnt)
# 결과 출력
print(result)
생각해볼 점
두 가지 포인트를 알고 가는 것이 좋을 것 같다. 하나는 체스판의 칸을 선택할 때 (i + j) % 2를 기준으로 나누면 멋지게 풀린다는 점이다. 두 번째는 이차원 리스트를 슬라이싱하는 방식인데, [row[j:j+m] for row in field[i:i+n]] 코드를 암기해두면 매우 편리할 것 같다. 이에 대해서 아래 블로그를 참고했으니, 링크를 남긴다.
※ 이차원 리스트의 슬라이싱 방법
https://programming119.tistory.com/169
[Python] 파이썬 2차원 리스트 Slicing / 일부분 선택, 추출하기 ✨
파이썬에서 1차원 리스트을 슬라이싱하는건 간단합니다. arr = "ABCDE" arr[0:3] = "ABC" 하지만 리스트가 2차원 이라면? 꽤나 골치아파지죠. numpy를 이용하면 되지만, numpy가 익숙하지 않은 저로서는 그
programming119.tistory.com