[백준 10단계] 1018 체스판 다시 칠하기
🥕 [ 백준 1018 ] 체스판 다시 칠하기
문제 링크
url : https://www.acmicpc.net/problem/1018
🍒 문제 분석
8*8 크기의 체스판은 다음과 같이 생겼다.
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
또는
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
타일이 주어졌을 때, 타일의 부분을 떼어내어, 체스판으로 고친다고 한다.
가장 최소로 타일을 고칠 때의 갯수를 구해보자.
가령 체스판이 BW 일 때, 타일 BB 에 대해서는 1개만 고치면 되므로 1이다.
🥑 코드
import sys
M, N = map(int, sys.stdin.readline().split())
tile = []
for _ in range(M):
L = sys.stdin.readline().strip()
tile.append(L)
color1, color2 = 'B', 'W'
mincnt = 64
for m in range(M-7):
for n in range(N-7):
cnt1, cnt2 = 0, 0
for i in range(m,m+8):
for j in range(n,n+8):
if tile[i][j] != color1 :
cnt1 += 1
if tile[i][j] != color2 :
cnt2 += 1
color1, color2 = color2, color1
color1, color2 = color2, color1
if cnt1<mincnt : mincnt = cnt1
if cnt2<mincnt : mincnt = cnt2
print(mincnt)
🍓 내 해결 과정
이전 별찍기 문제에서 그랬듯이, 행을 문자열로 받고, 열을 리스트로 받았다.
for 문이 무려 4개나 돌아가는데
주황색 박스가 주어진 타일에서 돌아댕기는게 처음 두 for문
for m in range(M-7):
for n in range(N-7):
그리고 이제 주황색 박스 내에서 고칠 타일이 몇개인지 검색하는게
다음 두 for문 이다.
cnt1, cnt2 = 0, 0
for i in range(m,m+8):
for j in range(n,n+8):
if tile[i][j] != color1 :
cnt1 += 1
if tile[i][j] != color2 :
cnt2 += 1
color1, color2 = color2, color1
color1, color2 = color2, color1
체스판에는 종류가 두가지가 있는데, 검은색으로 시작하냐, 흰색으로 시작하냐가 있다.
따라서 흰검흰검 / 검흰검흰 조사해야하는데
이렇게 쓰니깐 두가지를 한꺼번에 조사할 수 있고,
검사할 color1 과 color2를 계속 둘이 서로 바꿔주기만 하면 돼서 코드 쓰기에 매우 편했다.
🍉 깨달은 점 및 정리
체스판 같은거 할 때 반복문 너무 많이 들어가는거 겁내하지 말자~
분명히 적은 갯수의 N을 줄 것이다.
체스판의 예시와 같이 검사해야할 너비가 명시적으로 주어져 있다면
while문을 쓰는 것 보다 for 문 쓰는게 훨씬 더 깔끔하고 편하다.