[backjoon] 1018 체스판 다시 칠하기 (python)

나는야 토마토·2022년 2월 4일
0

algorithm

목록 보기
6/24
post-thumbnail

문제 1018번: 체스판 다시 칠하기

BruteForce 문제

문제에 대해서 요약하자면...

#1. 크기가 N X M이고, 흰색과 검은색으로 막 칠해져있는 보드판이 있다.
#2. 이 보드판을 잘라서 8 X 8크기의 체스판으로 만들려고 한다.
#3. 체스판은 흰색과 검은색이 번갈아가며 체크무늬를 이루어야 한다.
#4. 보드판을 잘라서, 체스판을 만들기 위해서 알맞게 색을 고쳐서 체크무늬를 만들어야 한다.
#5. 고쳐야 하는 색의 최소값을 구하라.


해결 방법
#1. 먼저 N*M만큼의 보드를 받아온다.

#2. 8*8로 잘라야 하기에, 행으로 i-7만큼, 열로 j-7만큼 고정시켜 줘야 한다. 이 방법이 아니고서는 인덱스 에러를 잡을 방법을 모르겠다.

#3. 고정시키고 난 이후는, i,j에서 i+8까지, j+8까지 전부 반복하면서 알맞게 체크무늬로 칠해져 있는지 확인한다.

#4. 흰색이 먼저인 경우와 검은색이 먼저있는 경우를 나누어서, 한번에 종합한 후, min()을 사용하여, 최소값을 알아낸다.


N, M = map(int, input().split())
board = list()
for i in range(N):
    board.append(input())
repair = list()

입력값들을 받아오는 코드

for i in range(N-7):
   for j in range(M-7):
       first_W = 0
       first_B = 0
       for k in range(i,i+8):
           for l in range(j,j + 8):
               if (k + l) % 2 == 0:
                   if board[k][l] != 'W':
                       first_W = first_W+1
                   if board[k][l] != 'B':
                       first_B = first_B + 1
               else:
                   if board[k][l] != 'B':
                       first_W = first_W+1
                   if board[k][l] != 'W':
                       first_B = first_B + 1
       repair.append(first_W)
       repair.append(first_B)
  • 4중 for문으로 사용해야한다.
  • 먼저, i와 j로 8X8의 최대 크기를 조절해 준다.
  • 왜냐하면, 9X9 보드에서 자를 수 있는 경우의 수는, 2X2로 4가지이다.
  • 또, 10X10 보드에서 자를 수 있는 경우의 수는 3X3으로 9가지이다.
  • 즉, NXM 보드에서 자를 수 있는 경우의 수는 N-i X M-j 가지가 된다.
  • 이후에 흰색으로 시작한 경우, 검은색으로 시작한 경우의 값을 초기화 해 준 뒤,
  • k와 l을 통해서 처음 자른 체스판부터 검사를 시작한다.
  • 여기서, 조건문을 보면, ( k + l ) % 2 == 0을 사용했는데,
    🔥🔥🔥이 이유는, 행과 열의 인덱스의 합이 짝수인경우, 일정한 한 색을 가지게 되고, 홀수인 경우에도, 다른 일정한 한 색을 가지게 된다.

전체코드

N, M = map(int, input().split())
board = list()
for i in range(N):
    board.append(input())
repair = list()

for i in range(N-7):
    for j in range(M-7):
        first_W = 0
        first_B = 0
        for k in range(i,i+8):
            for l in range(j,j + 8):
                if (k + l) % 2 == 0:
                    if board[k][l] != 'W':
                        first_W = first_W+1
                    if board[k][l] != 'B':
                        first_B = first_B + 1
                else:
                    if board[k][l] != 'B':
                        first_W = first_W+1
                    if board[k][l] != 'W':
                        first_B = first_B + 1
        repair.append(first_W)
        repair.append(first_B)

print(min(repair))

[백준 알고리즘/python] 백준 1018번 체스판 다시 칠하기, 파이썬 설명
아래의 블로그를 통해서 너무 많은 도움이 되었다! 완벽이해!!! 감사합당!🙇

profile
토마토마토

0개의 댓글