🔺 문제
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
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 1436번: 영화감독 숌 (0) | 2023.06.12 |
---|---|
[백준/JAVA] 1259번: 팰린드롬수 (0) | 2023.06.12 |
[백준/JAVA] 2776번: 암기왕 (0) | 2023.06.12 |
[백준/JAVA] 11003번: 최솟값 찾기 (0) | 2023.06.11 |
[백준/JAVA] 5347번: LCM (0) | 2023.06.10 |