[Java] 백준 1018번 - 체스판 다시 칠하기

2023. 7. 5. 19:56·백준

문제 링크 : 백준 1018번 - 체스판 다시 칠하기 자바

 

N*M의 행렬이 주어졌을 때, 8*8의 크기로 잘라내어 최소한으로 다시 칠할 수 있도록 하는 문제이다.

예로, 10*10의 검정색 행렬이 주어졌을 때 위 사진처럼 초록, 주황, 파랑 등 여러 위치에서 8*8의 크기로 잘라낼 수 있고, 이는 (0~N-8, 0~M-8)을 기준점으로 하여 10*10 행렬의 모든 부분 8*8 행렬을 탐색할 수 있다.

- 0~(10-8), 0~(10-8)

=> 0, 0

=> 0, 1

=> 0, 2

=> 1, 0

=> 1, 1

=> 1, 2

=> 2, 0

=> 2, 1

=> 2, 2

 

그런 후 이 부분 행렬을 정답 행렬(correctMatrix1, correctMatrix2)과 비교하여 최소로 바꿀 수 있는 수가 몇인지 탐색하여 반환한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static char[][] matrix;
    static char[][] correctMatrix1 =   {"BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray()};
    static char[][] correctMatrix2 =   {"WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray(),
                                        "WBWBWBWB".toCharArray(),
                                        "BWBWBWBW".toCharArray()};

    static int N;
    static int M;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] input = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        N = input[0];
        M = input[1];
        matrix = new char[N][M];
        for (int i = 0; i < N; i++) {
            matrix[i] = br.readLine().toCharArray();
        }
        int min = N * M;
        for (int i = 0; i <= N - 8; i++) {
            for (int j = 0; j <= M - 8; j++) {
                int result = getFillCount(i, j);
                if (result < min) min = result;
            }
        }
        System.out.println(min);


    }

    public static int getFillCount(int x, int y){
        int count1 = 0;
        int count2 = 0;
        for (int i = x; i < x + 8; i++) {
            for (int j = y; j < y + 8; j++) {
                if (matrix[i][j] != correctMatrix1[i-x][j-y]){
                    count1++;
                }
                if (matrix[i][j] != correctMatrix2[i-x][j-y]){
                    count2++;
                }
            }
        }
        if (count1 < count2)
            return count1;
        return count2;
    }
}

'백준' 카테고리의 다른 글

[Java] 백준 2839번 - 설탕 배달  (0) 2023.07.05
[Java] 백준 1436번 - 영화감독 숌  (0) 2023.07.05
[Java] 백준 2798번 - 블랙잭  (0) 2023.07.02
[Java] 백준 24313번 - 알고리즘 수업 - 점근적 표기 1  (0) 2023.07.02
[Java] 백준 24267번 - 알고리즘 수업 - 알고리즘의 수행 시간 6  (0) 2023.07.02
'백준' 카테고리의 다른 글
  • [Java] 백준 2839번 - 설탕 배달
  • [Java] 백준 1436번 - 영화감독 숌
  • [Java] 백준 2798번 - 블랙잭
  • [Java] 백준 24313번 - 알고리즘 수업 - 점근적 표기 1
효재감자
효재감자
  • 효재감자
    효재감자의 우당탕탕 개발일지
    효재감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • 아무거나 (3)
      • 백준 (44)
      • 알고리즘 (4)
      • 자바 (1)
      • 리눅스(우분투) 및 클라우드 (2)
      • 스프링 (14)
        • 스프링 시큐리티 인 액션 (도서 정리) (5)
      • 플러터(Dart) (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
효재감자
[Java] 백준 1018번 - 체스판 다시 칠하기
상단으로

티스토리툴바