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

문제
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
풀이
실버4부터 벽이 느껴지는 ww
푸는 데 도움이 된 아이디어들
1. zip을 사용하여 체스판과 입력값을 비교해야겠다!
2. B로 시작하는 체스판에서의 틀린 개수 == 64 - (W로 시작하는 체스판에서의 틀린 개수)
n, m = map(int, input().split())
board = [list(input()) for _ in range(n)]
chess = ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W']
min_cnt = 64
for i in range(n - 7):
for j in range(m - 7): #왼쪽끝점
cnt = 0
for k in range(i, i+8):
for x, y in zip(board[k][j:j+8], chess):
if k % 2 == 0 and x != y: cnt += 1
if k % 2 == 1 and x == y: cnt += 1
min_cnt = min(min_cnt, cnt, 64 - cnt)
print(min_cnt)
1. n, m을 입력받고 보드를 이차원 배열로 입력받는다.
2. 나올 수 있는 최댓값이 64이므로, min_cnt의 초깃값을 64로 설정한다.
3. 왼쪽 끝점이 될 수 있는 범위인 n-7, m-7에 대해 반복문을 돌린다.
4. 왼쪽 끝점에 대하여, k를 사용해 아래 8줄에 대한 검사를 실시한다.
5. zip을 사용하여 입력값과 체스판을 비교한다 (여기서 행 자리에 k 대신 i 써서 디버깅 엄청 고생함...)
6. 만약 짝수행이라면 BWBWBWBW와 다른값을 확인하고, 홀수행이라면 BWBWBWBW와 같은 값, 즉 WBWBWBWB와 다른값을 확인한다.
7. min을 사용하여 더 작은 값을 저장한다.

샤라웃 투 아스트로피직순
'Coding Test > Problems' 카테고리의 다른 글
| [BOJ] 10974번: 모든 순열 (0) | 2024.07.05 |
|---|---|
| [BOJ] 1895번: 필터 (1) | 2024.07.04 |
| [codetree] 괄호 쌍 만들어주기 3 (Novice Mid / 자리 수 단위로 완전탐색) (1) | 2024.07.03 |
| [codetree] 모이자 (Novice Mid / 자리 수 단위로 완전탐색) (1) | 2024.07.03 |
| [BOJ] 1969번: DNA (1) | 2024.07.03 |