호기심 많은 분석가
[백준 1018] 체스판 다시 칠하기 (Python 본문
여러 가지를 배운 문제였다. 우선 코드를 먼저 소개하고 설명하겠다.
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))
- 우선 우리는 8*8 형태의 체스판을 다룰 거기 때문에 M*N 테이블을 8*8로 잘라준다.
- 2차원 배열 리스트의 경우 [row[i: j] for row in graph[k: p]]의 형태로 슬라이싱할 수 있음.
- 그다음은 원래 재귀 함수를 통해 풀려고 했는데 조금 더 간단한 방법이 있었다.
- 체스판의 경우 (1,1), (1,3), (3,1), (2,2) 등의 합쳐서 짝수로만 이루어진 위치는 모두 같은 색을 가지고 있음
- 홀수의 경우도 마찬가지
- 따라서 더했을 때의 색을 (0, 0)의 색과 비교해서 잘못된 색이 몇 개인지 확인할 수 있음
- 재귀로 했으면 틀렸을 것 -> 처음 문제 파악을 잘못했다.
- 이렇게 끝날 줄 알았는데 하나의 경우를 생략함. (0, 0)의 색만 바꿔줬을 때 더 좋은 결과가 나올 수 있지 않을까?
총 이렇게 3단계의 코드를 거쳐 1018번을 해결할 수 있었다.
'Coding > Coding Test & Algorithm' 카테고리의 다른 글
[백준 2609] 최대공약수와 최소공배수 (Python) (0) | 2021.06.02 |
---|---|
[백준 1181] 단어 정렬 (Python) (0) | 2021.06.02 |
[백준 11050] 이항 계수 1 (Python) (0) | 2021.06.02 |
[백준 9625] BABBA (Python) (0) | 2021.05.27 |
[Python] 입력 받기 (sys.stdin.readline) (7) | 2021.05.27 |