개발이 취미인 주니어 기획자

[완전탐색][Java][BOJ] #1018. 체스판 다시 칠하기 본문

문제 풀이/알고리즘 문제 풀이

[완전탐색][Java][BOJ] #1018. 체스판 다시 칠하기

큐 2025. 2. 4. 00:29
728x90
반응형

#완전탐색  #Silver4

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

 

🌷 문제 설명

✏️ 백준 연습문제: #2470. 두 용액
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다. 체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다. 보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

⌨️ 입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

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

 

입출력 예

입력 출력
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
1
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
12
8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
0
9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW
31
10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB
0
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWWWB
BWBWBWBW
2
11 12
BWWBWWBWWBWW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBWWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
15

 

💡 해결 포인트

1.  8*8 체스판 범위 설정하기
- 최소 8*8이니까 범위는 N-8

2. 체스판 배열의 규칙
- 체스판은 W-B-W-B... 또는 B-W-B-W... 순서로 반복됨!
- (i + j) % 2 == 0이면
- W 시작 체스판에서는 W
- B 시작 체스판에서는 B가 와야 함
- 이걸 ㅠ 모르고 ㅠ 자꾸 dx dy로 풀려 하니까 답도 안나왔다 
- 이런건 어떻게 생각해내?ㅠㅠㅠㅠㅠ
        for (int i = 0; i < 8; i++) {
          for (int j = 0; j < 8; j++) {
            char expectedW = ((i + j) % 2 == 0) ? 'W' : 'B'; // 이 부분을 못생각해냄 멍청아
            char expectedB = ((i + j) % 2 == 0) ? 'B' : 'W';
            
            if (graph[n + i][m + j] != expectedW) {
              w++;
            }
            if (graph[n + i][m + j] != expectedB) {
              b++;
            }
          }
        }

 

 

 

🌷 내 코드

1. 완전탐색

import java.util.*;
import java.io.*;

public class BOJ_1018 {
  public static void main(String[] args) throws IOException {
    System.setIn(new FileInputStream("example.txt"));
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    // N, M 입력
    String[] firstLine = br.readLine().split(" ");
    int N = Integer.parseInt(firstLine[0]);
    int M = Integer.parseInt(firstLine[1]);
    
    // 그래프 입력받기
    char[][] graph = new char[N][M];
    for (int i = 0; i < N; i++) {
      graph[i] = br.readLine().toCharArray();
    }

    // 최소 색칠 횟수 찾기
    int minPaint = 50*50; // 최대값으로 초기화
    
    for (int n = 0; n <= N - 8; n++) { // 8*8 초과하면 안됨
      for (int m = 0; m <= M - 8; m++) {
        int w = 0; // W로 시작하는 체스판에서 색칠할 횟수
        int b = 0; // B로 시작하는 체스판에서 색칠할 횟수

        for (int i = 0; i < 8; i++) {
          for (int j = 0; j < 8; j++) {
            char expectedW = ((i + j) % 2 == 0) ? 'W' : 'B'; // 이 부분을 못생각해냄 멍청아
            char expectedB = ((i + j) % 2 == 0) ? 'B' : 'W';
            
            if (graph[n + i][m + j] != expectedW) {
              w++;
            }
            if (graph[n + i][m + j] != expectedB) {
              b++;
            }
          }
        }
        
        minPaint = Math.min(minPaint, Math.min(w, b)); // 제일 작은 숫자로 갱신
      }
    }
    
    System.out.println(minPaint);
  }
}

 

 

🌷 코멘트

실버 4따리에서부터 벽을 느끼는 알고병신
뭔가 문제에 규칙이 있으면 거기서부터 해법을 생각을 해내란 말이야!!!! 
2차원배열이라고 하고 상하좌우 체크하는거라 하니까 생각도 안하고 냅다 dx dy 해서ㅋㅋㅋ 지금생각하니 멀 하겠단건지 
아 아아악

 


블로그 내용에 문제가 있다면 댓글 혹은 아래로 연락주세요!
~대가리 꽃밭인 디지털 노마드가 꿈이예요~
🧚‍♀️ Gyumin Lee
📧 gyumin.q.lee@gmail.com

 

qminlee723 - Overview

noob. qminlee723 has 8 repositories available. Follow their code on GitHub.

github.com

728x90
반응형