본문 바로가기

코딩테스트/Python

[Python] 백준 #1018- 체스판 다시 칠하기

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

 

풀이

import sys
input = sys.stdin.readline

N,M = map(int,input().split())
arr = [list(input()[:-1]) for _ in range(N)]
color=['W','B']
arr_w=[[0 for i in range(M)] for j in range(N)]
arr_b=[[0 for i in range(M)] for j in range(N)]
for i in range(N):
    for j in range(M):
        color_idx = (i%2+j)%2
        if arr[i][j] != color[color_idx]:
            arr_w[i][j] = 1
        if arr[i][j] == color[color_idx]:
            arr_b[i][j] = 1
minimum = 64
for i in range(N):
    for j in range(M):
        sum_w,sum_b=0,0
        if i+8<=N and j+8<=M:
            for l in range(i,i+8):
                for k in range(j,j+8):
                    sum_w+=arr_w[l][k]
                    sum_b+=arr_b[l][k]
            minimum = min(minimum,sum_w,sum_b)
print(minimum)

 

N과 M크기의 보드가 주어졌을때 8*8크기로 자르고 색칠을 해야한다.

첫 인덱스가 흰색으로 칠했을때와 검정색으로 칠했을 때의 2가지 경우를 비교해야한다.

 

나는 먼저 N과 M의 크기로 주어진 보드를 흰색과 검정색의 2가지 경우를 비교해서 칠해야하는 부분을 고르고 그 다음에 8*8으로 잘랐을때 가장 적게 칠할 수 있는 부분을 골랐다.

 

 

1. 주어진 보드를 첫 인덱스의 흰, 검 여부에 따라 색칠해야하는 부분을 나누어서 저장해야하기 때문에 arr_w와 arr_b의 변수를 두었다.

2. 지금 위치해있는 인덱스의 색이 흰색으로 칠해야하는지 검정색으로 칠해야하는지 구분하기 위해서 color_idx라는 변수를 두었다.

3. 첫 번째부터 비교해보면서 색칠해야하면 arr_w와 arr_b에 1을 대입한다.

4. 이제 8*8으로 잘랐을때 가장 적게 칠할 수 있는 부분을 골라야한다. for문을 돌려가면서 찾아주었다.

 

 

 

그런데..! 왜 이렇게 푼지 모르겠다. 풀이를 적다가 방금 느낌..ㅠ

그래서 더 줄여봤다.

 

import sys
input = sys.stdin.readline

N,M = map(int,input().split())
arr = [list(input()[:-1]) for _ in range(N)]
color=['W','B']
minimum = 64
for i in range(N):
    for j in range(M):
        sum_w,sum_b=0,0
        if i+8<=N and j+8<=M:
            for l in range(i,i+8):
                for k in range(j,j+8):
                    color_idx = (l%2+k)%2
                    if arr[l][k] != color[color_idx]: sum_w+=1
                    if arr[l][k] == color[color_idx]: sum_b+=1
            minimum = min(minimum,sum_w,sum_b)

print(minimum)

 

첫 풀이에서 했던 arr_w, arr_b를 만들지 않고 바로 비교해가면서 풀었다.

훨 코드가 짧아진것을 볼 수 있다.

 

 


근데 신기한 현상이 일어남.. 코드가 더 짧아졌는데 시간은 더 늘었다. 왤까.. 혹시 아시는 분은 댓글 남겨주세요..ㅠ