Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

행복한 개구리

백준 21.12.28. 1018번 - 체스판 다시 칠하기 본문

Algorithm/BaekJoon

백준 21.12.28. 1018번 - 체스판 다시 칠하기

HappyFrog 2021. 12. 29. 00:55

N, M = map(int, input().split())

board = []

for _ in range(N):
    lineN = list(input())
    board.append(lineN)

result = []

for i in range(N - 7):
    for j in range(M - 7):
        count_W = 0
        count_B = 0
        for n in range(i, i + 8):
            for m in range(j, j + 8):
                if (n + m) % 2 == 0:	# 짝수칸일때
                    if board[n][m] != "W":
                        count_W += 1
                    if board[n][m] != "B":
                        count_B += 1
                else:			# 홀수칸일때
                    if board[n][m] != "B":
                        count_W += 1
                    if board[n][m] != "W":
                        count_B += 1
        result.append(count_W)
        result.append(count_B)

print(min(result))
  • 문제의 핵심은 지문의 두번째 문단에 있습니다.
    • => 이 정의를 따르면 체스판을 색칠하는 경우는 두 가진 뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
    • 이 말은 탐색을 두가지 상황으로 나누어 진행할 수 있다는 뜻인데, 첫 번째는 맨 왼쪽 위 칸이 흰 색인 경우, 두 번째는 검은색인 경우입니다.
    • 이렇게 나누면 첫번째 경우에는 홀수칸은 모두 흰색이어야 하며 짝수칸은 모두 검은색이어야 합니다.
    • 두 번째 경우엔 홀수칸은 모두 검은색, 짝수칸은 모두 흰색 이어야 합니다.
  • 이에 따라 분기를 나눠줍니다.
  • 두 가지 분기에 맞춰 구할 값을 저장해야 하니 흰색으로 바꿔야 하는 경우의 수 count_W와 검은색인 경우의 수 count_B를 만들었습니다.
  • 그리고 8*8 배열을 순차적으로 탐색할 수 있는 for i문과 for j 중첩 반복문을 을 만들어 줍니다.
    • range가 N-7, M-7인 이유는 8*8배열을 만들어야 하기 때문입니다.
      • ex) N = 8, M = 8 이라면 8*8 배열은 1가지 밖에 없으므로 range(1), range(1)이 되며 정상적으로 실행됩니다.
  • 그리고 해당 8*8배열 안에서 또 다시 중첩반복문을 사용하여 모든 요소들을 검사합니다.
    • 맨 왼쪽 위 칸이 0,0
       
    • 맨 왼쪽 위칸이 (0,0) 일 때, 홀수칸의 인덱스인 n과 m을 더해도 홀수가 나오므로 조건문으로 짝수칸과 홀수칸을 나눌 수 있습니다.
  • 그리고 짝수칸에 흰색, 홀수칸에 검은색을 넣을 때와 짝수칸에 검은색, 홀수칸에 흰색을 넣을 때의 검은색, 흰색 경우의 수를 모두 구하여 각각 더해줍니다.
  • 위에서 구해진 검은색과 흰색의 경우의 수는 각각 맨 왼쪽 위 칸이 검은색, 흰색일 때 수정해야할 최소의 경우의 수입니다.
  • 이제 결과값을 result 리스트에 추가하여 최솟값을 출력해줍니다.