본문 바로가기
코딩테스트/코딩테스트 문제

코딩테스트 준비 - 백준1018번 체스판 풀이(파이썬)

by 공부가싫다가도좋아 2021. 5. 28.
반응형

백준 1018번 풀이


문제풀러가기

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net




풀이

1. 8*8칸씩 범위를 잡고 다시 칠해야 되는 부분의 갯수를 구한다.

1-1 경우의 수 

1) N과 M이 8보다 클때

-> 인덱스를 1씩 더해, 8*8사각형을 옮겨 가며 갯수를 구해주면 된다.

더보기

예를 들어, M=9인 경우

 

처음에는 0~7까지 다시칠해야 되는 갯수를 구한다.

그 다음 1을 더해주어 1~8까지 다시 칠해야 되는 갯수를 구한다.

그 다음 1을 또 더해주어 2~9가지 다시 칠해야 되는 갯수를 구한다.

(N도 마찬가지.)

2)WB 순서

-> 'W'가 맨처음 시작할때 다시 칠해야 되는 갯수

->'B'가 맨 처음 시작할때  다시 칠해야 되는 갯수

 

2. 구한 갯수 마다 리스트에 넣은 후, 제일 작은 숫자를 출력한다.


코드

N,M = map(int, input().split())
arr = []
arr_min = []

for i in range (N):  #체스판 한줄씩, 리스트에 넣기
  a = input()
  arr.append(a)

#N과 M이 8보다 클 시, 큰 숫자 만큼 1씩 더해줌.
for i in range (N-7): 
  for j in range (M-7):
    num1 = 0
    num2 = 0
    for a in range(i, i+8):
      for b in range(j, j+8):
        if (a+b)%2 == 0: 
          if arr[a][b] != 'W': #W가 아닐때 
            num1+=1            #W로 칠해주는 갯수
          else:				   #B가 아닐때
            num2+=1            #B로 칠해주는 갯수
        else:
          if arr[a][b] != 'B':
            num1+=1
          else:
            num2+=1 

    arr_min.append(num1)  #체스판이 W로 시작할때 경우의 수
    arr_min.append(num2)  #체스판이 B로 시작할때 경우의 수

print(min(arr_min))
반응형

댓글