김찬진의 개발 블로그

[23/04/17] B1018 본문

1일1알고/Java Algorithm

[23/04/17] B1018

kim chan jin 2023. 4. 17. 00:28
package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

// 체스판 다시 칠하기
public class B1018 {
    public static boolean[][] arr; // 2차원 배열
    public static int min = 64; // 최대 색칠 횟수 8 * 8 부터 잡아두고 최소값으로 갱신

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int N = Integer.parseInt(st.nextToken()); // 토큰만 읽음
        int M = Integer.parseInt(st.nextToken()); // 토큰만 읽음

        arr = new boolean[N][M];

        for (int i = 0; i < N; i++) { // 행 11개
            String line = br.readLine(); // 개행문자 전까지만 읽음

            for (int j = 0; j < M; j++) { // 열 12개

                if (line.charAt(j) == 'W') {
                    arr[i][j] = true; // White는 true로 가정
                } else {
                    arr[i][j] = false; // Black은 false로 가정
                }
            }
        }

        int checkRow = N - 7;
        int checkCol = M - 7;

        for (int i = 0; i < checkRow; i++) {
            for (int j = 0; j < checkCol; j++) {
                find(i, j);
            }
        }
        System.out.println(min);
    }

    public static void find(int x, int y) {
        int endOfX = x + 8;
        int endOfY = y + 8;
        int count = 0;

        boolean TF = arr[x][y]; // 처음 위치 (x,y)의 색깔을 기준으로 정하기

        for (int i = x; i < endOfX; i++) {
            for (int j = y; j < endOfY; j++) {
                if (arr[i][j] != TF) {
                    count++;
                }
                TF = !TF; // 다음 확인 과정 때 다음칸 색깔과 반대 색깔과 일치하지 않는지 확인해야 하니깐 색깔을 반대로 바꾸기
            }
            TF = !TF; // 행이 바뀌니깐 색깔 반대로 바꾸기
        }

        // TF(첫 색깔)가 만약 반대 색깔이었을 경우도 고려
        count = Math.min(count, 64 - count);

        // 기존의 min과 비교하여 만약 더 작다면 min 갱신
        min = Math.min(min, count);
    }
}

 

느낀점

Scanner 대신 BufferedReader를 사용하자

어짜피 입력값은 String이니깐 String[] 쓸 생각말고 StringTokenizer를 쓰자

String을 원시형으로 캐스팅하는 Wrapper.parse원시형(문자열)을 쓰자

반복문 안에서 입력값을 받아야 하는지, 반복문 밖에서 입력값을 받아야 하는지 판단하자

4중 반복문이라고 해서 모두 시간초과가 발생하는 것이 아니다. brutal force가 적합한 문제라면 4중 반복문도 쓸 수 있다.

예외사항을 고민해보자

'1일1알고 > Java Algorithm' 카테고리의 다른 글

[23/04/17] B1051  (0) 2023.04.17
[23/04/17] B2231  (0) 2023.04.17
[23/04/17] B11478  (0) 2023.04.17
23/02/03 [⭐Inf_0203 소수(에라토스테네스 체)]  (0) 2023.02.03
23/02/02 [Inf_0204 피보나치 수열]  (0) 2023.02.03
Comments