코딩테스트/백준 단계별

[백준 10단계] 1018 체스판 다시 칠하기

scone 2022. 5. 19. 18:52

🥕 [ 백준 1018 ] 체스판 다시 칠하기

문제 링크

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

🍒 문제 분석

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 문 쓰는게 훨씬 더 깔끔하고 편하다.