https://www.acmicpc.net/problem/1018
풀이
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를 만들지 않고 바로 비교해가면서 풀었다.
훨 코드가 짧아진것을 볼 수 있다.
근데 신기한 현상이 일어남.. 코드가 더 짧아졌는데 시간은 더 늘었다. 왤까.. 혹시 아시는 분은 댓글 남겨주세요..ㅠ
'코딩테스트 > Python' 카테고리의 다른 글
[Python] 백준 #2750 - 수 정렬하기 (0) | 2021.11.22 |
---|---|
[Python] 백준 #1436- 영화감독 숌 (0) | 2021.11.22 |
[Python] 백준 #7568 - 덩치 (0) | 2021.11.22 |
[Python] 백준 #2231 - 분해합 (0) | 2021.11.22 |
[Python] 백준 #2798 - 블랙잭 (0) | 2021.11.22 |