Notice
Recent Posts
Recent Comments
Link
04-27 00:53
«   2025/04   »
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
관리 메뉴

<<개발일지>>

[백준/1018/구현/체스판 다시 칠하기] 본문

코딩테스트

[백준/1018/구현/체스판 다시 칠하기]

개발하는지호 2024. 4. 11. 19:43

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

 

<<풀이>>

 

하 ㅋㅋ 일단 내 논리적인 생각은 틀린 것이 없었다. 다만 ,, ㅋㅋㅋ 휴ㅠ

 

문제를 잘 못 읽었다 ㅋㅋㅋ ㅠ

 

내가 생각한 문제는 주어진 모든 값들에서 추출해 체스판을 만들 수 있냐?? 라고 생각했지만,

 

다시 읽어 본 결과, 저기서 8 x 8 잘라서 색을 칠하는 최소 횟수를 구하는 것이었다.

 

아예 접근이 잘못된 것이다.

 

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

class Main {
    static int N, M = 0;

    private int solution(String[] brr, int n, int m) {
        for (int i = 0; i < n; i++) {
            String leng = "";
            String[] a = brr[i].split("W");;
            for(String x : a) leng=leng+x;
            
            N += leng.length();


        }
        M = n * m - N;
        int b = Math.min(N, M);
        if (32 > b) return 32 - b;
        else return 0;
    }



    public static void main(String[] args) throws Exception{
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = br.readLine().split(" ");
        int n = Integer.parseInt(arr[0]);
        int m = Integer.parseInt(arr[1]);
        String[] brr = new String[n];
        for (int i = 0; i < n; i++) {
            brr[i] = br.readLine();
        }
        System.out.println(T.solution(brr, n, m));
    }


}
​

 

 

 

 

 

정답풀이

 

 

위의 그림을 보면 알겠지만 결국 흰색 판부터 시작하는거랑 검은색부터 시작하는 것을 합한다면 판의 칸 수가 일정하게 나오게 된다.

현재 우리는 8x8로 했기 때문에 64개의 판이 나오게 되는데 이를 활용해서 하나만 기준으로 잡고 거기서 64에서 빼고 뺀 값과 기준으로 잡은 것 중에 작은 것을 추출하면 되는 것이다 !!

 

import java.util.Scanner;

class Main {
    static int min = Integer.MAX_VALUE;
    static String[] brr = {"WBWBWBWB", "BWBWBWBW"};


    private int solution(int startRow, int startCol, String[] arr) {
        int whiteBlock = 0;
        for (int i = 0; i < 8; i++) {
            int row = startRow + i;
            for (int j = 0; j < 8; j++) {
                int col = startCol + j;

                if (arr[row].charAt(col) != brr[row % 2].charAt(j)) whiteBlock++;
            }
        }
        return Math.min(64-whiteBlock, whiteBlock);
    }


    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        in.nextLine();
        String[] arr = new String[n];
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextLine();
        }

        for (int i = 0; i <= n-8; i++) {
            for (int j = 0; j <= m-8; j++) {
               int answer = T.solution(i, j, arr);

               if (min > answer) min = answer;

            }
        }
        System.out.println(min);

    }
}

 

그리고 여기서 또 신기한 형태가 있다면 바로 수학적인 개념인데 r % 2 의 형태이다 !!

 

어떻게 보면 당연한 원리이지만 이러한 디테일을 바로적용하는냐는 정말 많은 연습이 필요한 것이다.

 

이를 활용할 경우 반복되는 형태를 굳이 다 쓸 필요없게 된다.

 

너무 신기하다 ㅋㅋ

 

이러한 센스 나도 배우고 가련다 ~~

 

<<추가 공부>>

 

nextInt()

 

nextLine()

 

next()

 

문제를 풀다가 보면 상황에 따라 입력 코드가 다르다!! 

 

nextInt() -> 숫자를 입력 받는다.

next() -> 단어 한개를 받는다.

nextLine() -> 한 줄을 입력 받는다.

 

<오류 발생>

 

nextInt()를 쓰고

 

nextLine() 을 사용하게 되면 문제가 발생할 수가 있다.

 

나는 아무것도 입력 안 했는데 자동으로 nextLine()에 입력이 되는데

 

nextInt()를 작성하고 엔터를 치면 /n 이라는 개행문자가 그 다음 nextLine()에 적용이 된다 !!

 

예전에도 이런 경험이 있어서 공부했지만 또 오랫동안 사용 안 하다보니 까먹었다 ㅋㅋ

 

이를 해결하기 위해서는 nextInt()를 작성해주고 그 다음 한 줄은 nextLine() 하나를 줌으로써 개행문자를 없앤 뒤에

 

다음 nextLine()을 활용하면 된다.

 

 

 

 

'코딩테스트' 카테고리의 다른 글

[인프런/BFS/12.토마토]  (1) 2024.05.19
[인프런/greedy/결혼식]  (0) 2024.04.17
[인프런/BFS/11. 미로의 최단거리 통로]  (0) 2024.04.09
[백준/1015/수열 정렬]  (1) 2024.04.06
[인프런/DFS/10.미로탐색]  (5) 2024.04.01