미소를뿌리는감자의 코딩

[백준 2024/01/24] 1018번 체스판 다시 칠하기 본문

코딩 테스트/백준

[백준 2024/01/24] 1018번 체스판 다시 칠하기

미뿌감 2024. 1. 24. 20:32
728x90

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

1. 접근 방법

이번 문제는 코드를 어떻게 구성해야 할지 고민이 많았던 문제이다.

노트에 쓰고 지우고 쓰고 지우다가 우선 2중 for문을 만들어서, 8*8을 쭉 훑을 수 있는 코드를 작성해보자고 적어보았다.

 

 

for(int i=0; i<8; i++){
    for(int k = 0; k<8; k++){
        if(case1[i][k] != contrast[a+i][b+k]){
            f_alse +=1;
        }
    }
}

 

그래서 이렇게 for문을 구성해보았고, 입력으로 받아온 보드의 크기에 따라 +a +b를 해주어

모든 경우의 수를 돌아보게 만들어야겠다고 생각했다.

b의 경우 보드의 width 크기가 10일 경우에 0, 1, 2 까지 더해져야 한다. 

(a)만약 height가 11일 경우에는, 0, 1, 2, 3 까지 더해져야 한다. 

이를 다시 a와 b에 대한 2중 for 문으로 감싸줘야겠다고 생각했다.

 

for(int b = 0; b<= m-8; b++){
    for(int a = 0; a<= n-8; a++){
        for(int i=0; i<8; i++){
            for(int k = 0; k<8; k++){
                if(case1[i][k] != contrast[a+i][b+k]){
                    f_alse +=1;
                }
            }
        }
        if(ff_alse > f_alse){
            ff_alse = f_alse;
        }
        f_alse = 0;
    }
}

 

이렇게 코드를 작성했다. for문이 4개라니...! 가장 먼저 시간 초과가 걱정되기 시작했다.

하지만, 이것 이외에 방법은 생각나지 않았기에 강행하기로 했다.

 

ff_alse의 변수의 경우 최소 값이 나타날 경우 값은 바꾸도록 만들어 놓았다.

 

W로 시작하는 보드판의 경우와

B로 시작하는 보드판의 경우 2가지를 모두 나타내주었다.

 

char[][] case1 = {
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
};

char[][] case2 = {
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
        {'B','W','B','W','B','W','B','W'},
        {'W','B','W','B','W','B','W','B'},
};

뭔가 심리적 안정이 되는듯한 그런 모습이다..ㅎ

+ 뭔가몽가.. 코드가 긴 느낌이다.

짧게 효율적으로 만들 방법이 없을까

 

2. 코드

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.*;

public class b1018 {
    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        char[][] case1 = {
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
        };

        char[][] case2 = {
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
                {'B','W','B','W','B','W','B','W'},
                {'W','B','W','B','W','B','W','B'},
        };

        String line = reader.readLine();
        String[] w_h = line.split("\\s+");
        int n = Integer.parseInt(w_h[0]);
        int m = Integer.parseInt(w_h[1]);

        char[][] contrast = new char[n][m];

        for(int i = 0; i<n; i++){
            String lin = reader.readLine();
            for(int j = 0; j< m; j++){
                contrast[i][j] = lin.charAt(j);
            }
        }

        int f_alse = 0;
        int ff_alse = 65;

        for(int b = 0; b<= m-8; b++){
            for(int a = 0; a<= n-8; a++){
                for(int i=0; i<8; i++){
                    for(int k = 0; k<8; k++){
                        if(case1[i][k] != contrast[a+i][b+k]){
                            f_alse +=1;
                        }
                    }
                }
                if(ff_alse > f_alse){
                    ff_alse = f_alse;
                }
                f_alse = 0;
            }
        }

        f_alse = 0;

        for(int b = 0; b<= m-8; b++){
            for(int a = 0; a<= n-8; a++){
                for(int i=0; i<8; i++){
                    for(int k = 0; k<8; k++){
                        if(case2[i][k] != contrast[a+i][b+k]){
                            f_alse +=1;
                        }
                    }
                }
                if(ff_alse > f_alse){
                    ff_alse = f_alse;
                }
                f_alse = 0;
            }
        }

        System.out.println(ff_alse);

    }

}
728x90