백준 : 체스판 다시 칠하기 - 1018

2025. 10. 4. 02:10·알고리즘
반응형

출력

첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

예제 입력 1 

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

예제 출력 1 

1

예제 입력 2 

10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

예제 출력 2 

12

예제 입력 3 

8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

예제 출력 3 

0

예제 입력 4 

9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW

예제 출력 4 

31

예제 입력 5 

10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB

예제 출력 5 

0

예제 입력 6 

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWWWB
BWBWBWBW

예제 출력 6 

2

예제 입력 7 

11 12
BWWBWWBWWBWW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBWWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW

예제 출력 7 

15

 

이 문제는 솔직하게 곧바로 문제를 어떻게 풀지 생각나지 못했다. 어떻게 해야할지 고민이 많이 된 문제였다. 일단 패턴으로는 8X8의 정사각형이 있으며, B로 시작하는 패턴, W로 시작하는 패턴 2가지가 존재한다. 

 

import sys

def solve():
    N, M = map(int, sys.stdin.readline().split())
    board = []
    for _ in range(N):
        board.append(sys.stdin.readline().strip())

    min_changes = float('inf')  # 최소 변경 횟수를 저장할 변수, 무한대로 초기화

초기에는 입력값과 답을 찾기 전에 최소 칠하기 횟루르 저장할 변수를 초기화 시켰다.

 

for i in range(N - 7):
        for j in range(M - 7):
            count_w_start = 0
            count_b_start = 0

            for x in range(i, i + 8):
                for y in range(j, j + 8):
                    if (x + y) % 2 == 0:
                        if board[x][y] != 'W':
                            count_w_start += 1
                        if board[x][y] != 'B':
                            count_b_start += 1
                    else:
                        if board[x][y] != 'B':
                            count_w_start += 1
                        if board[x][y] != 'W':
                            count_b_start += 1

            min_changes = min(min_changes, count_w_start, count_b_start)

여기가 중요한데 이중 반복문은 모든 가능한 8X8 보드의 시작점을 i,j 로 지정하여 시작하고 N-7, M-7로 하는 이유는 보드 범위가 벗어나지 않도록 하기 위함이다.  예를 들어, 10x10 보드에서 8x8 보드는 행의 경우 0, 1, 2 (총 3개), 열의 경우 0, 1, 2 (총 3개)의 시작점을 가질 수 있있다. range(10-7)은 range(3)이므로 0, 1, 2가 된다.

그렇게 두번째 이중 반복문은 현재 선택된 보드 내부의 모든 칸을 탐색하도록 하고, if (x + y) % 2 == 0:: 이 조건은 (x,y) 칸이 시작점 (i,j)와 동일한 색상이어야 하는 위치인지 판별하도록 한다. 게다가 홀수라면 시작점과 당연히 다른 색상이어야 한다.

min_changes = min(min_changes, count_w_start, count_b_start): 한 8x8 보드에 대한 계산이 끝나면, W 시작 횟수와 B 시작 횟수 중 더 작은 값을 찾아 현재의 min_changes와 비교하여 최소값을 갱신하도록 한다.

 

이 문제는 스스로 다 풀지 못했고, 다른 분들의 코드를 참고하여 문제를 해결하였다. 

https://ittrue.tistory.com/60, 

https://dev-nicitis.tistory.com/62 (특히 이 분은 참고하는 것보다 색다른 접근법으로 놀랐다.)

 

 

반응형

'알고리즘' 카테고리의 다른 글

백준 : 토마토 - 7576  (0) 2025.10.10
백준 : 스택 수열 - 1874  (0) 2025.10.06
백준 : 괄호 - 9012  (0) 2025.10.04
백준 : 좌표 정렬하기 - 11650  (0) 2025.10.04
백준 : 요세푸스 문제 0 - 11866  (0) 2025.10.03
'알고리즘' 카테고리의 다른 글
  • 백준 : 토마토 - 7576
  • 백준 : 스택 수열 - 1874
  • 백준 : 괄호 - 9012
  • 백준 : 좌표 정렬하기 - 11650
Feel나는 대로 GI록하는 글
Feel나는 대로 GI록하는 글
세상을 위한 개발자가 되기 위하여
    반응형
  • Feel나는 대로 GI록하는 글
    FeelGI
    Feel나는 대로 GI록하는 글
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • ML & AI (3)
        • 논문 리뷰 (1)
        • Computer Vision (0)
        • Digital Image Processing (1)
      • 알고리즘 (46)
      • 프로그램(대회,공모전,프로그램) (2)
      • 도서 (0)
      • 필기록 (1)
        • 회고록 (0)
        • 끄적끄적 (1)
      • 취업 준비 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    14761
    백준 토마토 7576
    백준 토마토
    동적계획
    28702
    코딩테스트
    IT대학생
    코테
    LG Aimers
    스택 수열
    백준
    ICT 학점연계 프로젝트 인턴십
    파이썬
    알고리즘
    #코드트리 #코딩테스트 #코테공부 #코테준비 #알고리즘공부 #갭체크
    DP #알고리즘 #백준 #Python
    LG AI
    FizzBuzz
    구현 #문자열 #백준 #python
    파이토치
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Feel나는 대로 GI록하는 글
백준 : 체스판 다시 칠하기 - 1018
상단으로

티스토리툴바