https://www.acmicpc.net/problem/1018
이해하는데 상당히 애먹었다. 아직 그래프를 그려주는 문제는 복잡해서 어려운가보다. 난이도는 실버4지만 체감 난이도는 골드 이상이었다. 이러한 문제를 많이 풀어본 고수들 입장에서는 실버4 난이도라고 느꼈다는것이니 나도 나중에 슉슉 풀 수 있는 날을 위해 포스팅을 해보려고 한다.
n, m = map(int, input().split())
board = [ ]
for _ in range(n):
board.append(input())
answer = []
for col in range(n - 7): #1
for row in range(m - 7): #1
countW = 0
countB = 0
for i in range(col, col + 8): #2
for j in range(row, row + 8): #2
if (i + j) % 2 == 0: #3
if board[i][j] != 'W': countW += 1 #4
if board[i][j] != 'B': countB += 1 #5
else: #3
if board[i][j] != 'B': countW += 1 #4
if board[i][j] != 'W': countB += 1 #5
answer.append(countW)
answer.append(countB)
print(min(answer))
브루트포스 문제다.
#1 : n-7을 해주는 이유는 n,m의 범위가 8 <= n, m <= 50이기 때문이다. 7을 빼줘서 최소한 1은 남겨야 하기 때문에 7을 빼준것이고 8을 빼면 완전히 0이 되어버리기 때문에 최대한 빼서 8x8로 자를때 인덱스 초과가 나오지 않도록 하기 위해서다.
#2 : i와 j는 인덱스 시작값을 0이 되는데 +8을 해주기 때문에 이중 for문을 이용해서 8x8로 자르고 거기서 부터 BW 또는 WB가 지그재그로 칠해져 있지 않은 필드를 찾으면 된다.
#3 : ( i + j ) % 2 == 0는 합이 짝수를 의미하는데 i, j가 0, 0에서 시작하니까 처음 반복문을 돌릴땐 왼쪽 맨 위의 값을 의미한다. 그리고 else문에선 인덱스 (0,1)이라서 바로 옆자리를 의미한다.
#4, 5 : 어떤 체스판의 왼쪽 맨위 필드가 Black으로 시작할지 white로 시작할지 모른다. 그래서 최소값을 구하기 위해 White, Black으로 번갈아가면 #4에서는 검사한다. #4에서는 WBWB... 순으로 진행되는걸 가정하니까 BB인 경우 첫번째 원소가 W가 아니라서 countW를 +1해준다. 그러면 else문의 #4에서 두번째 원소가 무조건 B일테니 추가해주지 않아도 된다. 만일 BWBWBW... 순으로 진행된다면 #4에서 두번 걸려서 countW +2가 아니라 #5에서 판단하게된다. #5에서 걸리게 되려면 BWBWBW... 순서에서 WW 또는 BB로 순서가 올테니까. 그래서 #4와 #5끼리 세트로 묶어준것이다.
*그래프 문제는 어렵다. 다시 돌아와서 열심히 복습하고 문제도 많이 접해서 극복해내겠다!!
'[Coding Test] > [백준]' 카테고리의 다른 글
[백준] 2798 파이썬(python) : 블랙잭 (0) | 2022.06.24 |
---|---|
[백준] 2231 파이썬(python) : 분해합 (0) | 2022.06.24 |
[백준] 1436 파이썬(python) : 영화감독 숌 (0) | 2022.06.24 |
[백준] 17478 파이썬(python) : 재귀함수가 뭔가요? (0) | 2022.06.23 |
[백준] 10870 파이썬(python) : 피보나치 수 5 (0) | 2022.06.23 |