호기심 많은 분석가

[백준 1018] 체스판 다시 칠하기 (Python 본문

Coding/Coding Test & Algorithm

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

DA Hun 2021. 6. 2. 20:27
 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 여러 가지를 배운 문제였다. 우선 코드를 먼저 소개하고 설명하겠다.

def get_result(data) : 
  result = 0
  for t in range(8) :
      for q in range(8) :
          if (t+q)%2 == 0 and data[t][q] != data[0][0] :
              result += 1
          if (t+q)%2 == 1 and data[t][q] == data[0][0] :
              result += 1
  return result  

def color_chess(data):
    result = get_result(data)
    if data[0][0] == 'W' :
      data[0][0] = 'B'
      result = min(result, get_result(data)+1)
    else : 
      data[0][0] = 'W'
      result = min(result, get_result(data)+1)
    return result
  
import sys
n, m = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().strip()) for _ in range(n)]

ans_list = []
for i in range(n-7) :
  for j in range(m-7) :
    temp_gp = [row[0+j:8+j] for row in graph[0+i:8+i]]
    ans_list.append(color_chess(temp_gp))

print(min(ans_list))
​
  1. 우선 우리는 8*8 형태의 체스판을 다룰 거기 때문에 M*N 테이블을 8*8로 잘라준다.
    1. 2차원 배열 리스트의 경우 [row[i: j] for row in graph[k: p]]의 형태로 슬라이싱할 수 있음.
  2. 그다음은 원래 재귀 함수를 통해 풀려고 했는데 조금 더 간단한 방법이 있었다.
    1. 체스판의 경우 (1,1), (1,3), (3,1), (2,2) 등의 합쳐서 짝수로만 이루어진 위치는 모두 같은 색을 가지고 있음
    2. 홀수의 경우도 마찬가지
      1. 따라서 더했을 때의 색을 (0, 0)의 색과 비교해서 잘못된 색이 몇 개인지 확인할 수 있음
      2. 재귀로 했으면 틀렸을 것 -> 처음 문제 파악을 잘못했다.
  3. 이렇게 끝날 줄 알았는데 하나의 경우를 생략함. (0, 0)의 색만 바꿔줬을 때 더 좋은 결과가 나올 수 있지 않을까?

총 이렇게 3단계의 코드를 거쳐 1018번을 해결할 수 있었다.