코테/백준

[백준/JAVA] 1018번: 체스판 다시 칠하기

imname1am 2023. 6. 12. 16:21
반응형

🔺 문제

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

 

🔺 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        // 0. input 받기
        int row = Integer.parseInt(st.nextToken());
        int col = Integer.parseInt(st.nextToken());
        
        String[] board = new String[row];
        for(int i = 0 ; i < row ; i++) {
            board[i] = br.readLine();
        }
        
        // 1. 체스판 자르기
        int sol = Integer.MAX_VALUE;
        for(int i = 0 ; i <= row - 8 ; i++) {
            for(int j = 0 ; j <= col - 8 ; j++) {
                // 2. 현 체스판의 최소 비용 구하기
                int curSol = getSolution(i, j, board);
                
                // 3. 전체 최적의 값과 비교해 갱신
                if(sol > curSol) sol = curSol;
            }
        }
        
        System.out.println(sol);
        br.close();
    }
    
    private static int getSolution(int sRow, int sCol, String[] board) {
        String[] ansBoard = {"WBWBWBWB""BWBWBWBW"};
        int whiteSol = 0;
        
        for(int i = 0 ; i < 8 ; i++) {
            int row = sRow + i;
            
            for(int j = 0 ; j < 8 ; j++) {
                int col = sCol + j;
                
                if(board[row].charAt(col) != ansBoard[row % 2].charAt(j))
                    whiteSol++;
            }
        }
        return Math.min(whiteSol, 64 - whiteSol);
    }
}
 
cs
✅ 해결 아이디어
✔ 브루트포스

 

 

 


🔺 다른 풀이들

- boolean[][]을 사용하셨다.. 역시 최공....

 

[백준] 1018번 : 체스판 다시 칠하기 - JAVA [자바]

www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어

st-lab.tistory.com

 

 

- 과정 설명 굿..

 

[백준 알고리즘][자바] 1018번 : 체스판 다시 칠하기

https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가

hyunipad.tistory.com

 

[백준 / JAVA] 백준 알고리즘 1018번 체스판 다시 칠하기 - 𝝅번째 알파카의 개발 낙서장

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를

blog.itcode.dev


💬 느낀 점

이것이 실버?

구현 실력 늘으려면 아직 멀었다...

 

BW로 시작하는 경우의 수 뿐만 아니라

WB로 시작하는 경우의 수도 놓치지 않는 것이 포인트 같다.

 

1회독 2회독 3회독 4회독 5회독
V 240724      

 

 

(+ 240724 2회독)

- (i + j ) % 2 : 칸의 위치에 따라 색을 번갈아 가며 확인하기 위해 사용

   ㄴ (i + j) % 2 == 0: 기준 색깔과 동일해야 한다.

   ㄴ (i + j) % 2 == 1: 기준 색깔과 반대여야 한다.

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M;
    static char[][] map;
    static int min = Integer.MAX_VALUE;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new char[N][M];
        
        for(int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }
        
        for(int i = 0; i <= N-8; i++) {
            for(int j = 0; j <= M-8; j++) {
                paint(i, j);
            }
        }
        
        System.out.println(min);
    }
    
    private static void paint(int x, int y) {
        int cnt1 = 0// 'B'로 시작하는 경우
        int cnt2 = 0// 'W'로 시작하는 경우
        
        for (int i = 0 ; i < 8 ; i++) {
            for (int j = 0 ; j < 8 ; j++) {
                if ((i + j) % 2 == 0) {
                    if(map[x+i][y+j] != 'B') cnt1++;
                    if(map[x+i][y+j] != 'W') cnt2++;
                }
                else {
                    if(map[x+i][y+j] != 'W') cnt1++;
                    if(map[x+i][y+j] != 'B') cnt2++;
                }
            }
        }
        
        min = Math.min(min, Math.min(cnt1, cnt2));
    }
}
 
cs

 


(참고)

✔ 깔끔 그 잡채 최고의 설명... 참고하여 코드를 작성했다.

 

[백준 1018] 체스판 다시 칠하기 (완전탐색) - java 자바

0. 자세한 설명은 YouTube 영상으로 1-1. 완전탐색 Solution import java.util.Scanner; class Main { public static int getSolution(int startRow, int startCol, String[] board) { String[] orgBoard = { "WBWBWBWB", "BWBWBWBW" }; int whiteSol = 0; for

coding-grandpa.tistory.com

반응형