Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- backtracking
- 백준
- BFS
- OS
- algorithm
- 백트래킹
- DFS
- 네트워크
- 그래프
- 운영체제
- lambda
- 알고리즘
- DP
- java
- baekjoon
- 자료구조
- kotlin
- back-end
- Java8
- 프로그래머스
- Spring
- 스프링
- 코틀린
- 모던자바
- TDD
- 자바
- Brute-force
- LEVEL2
- programmers
- 프로젝트
Archives
- Today
- Total
요깨비's LAB
[백준, Simulation, JAVA] P.1018 체스판 다시 칠하기 본문
체스판이라는 것을 명심하고 풀이에 들어가야 합니다. 상하좌우 색깔이 서로 달라야 합니다. 단순하게 한줄에 최적의 경우만
찾아서는 안됩니다.
1. 우선 주어진 맵에서 X = 0번째에서 주어진 M 크기 - 8, Y = 0번째에서 주어진 N크기 - 8의 기준을 주어 8*8의 맵을 가져옵니다.
2. y = 0~6(현재위치 ?= 현재위치 + 1) , x = 0으로 먼저 흰/검 값을 정한 뒤에(흰색 시작, 검정색 시작 두가지)
y= 0~7번째 마다 map[y][0], map[y][1] .... map[y][6]으로 x에 대한 흰/검 값들을 정해주면서
map[y][x] == map[y][x+1]이면 count 값을 증가 시키고 map[y][x+1]의 값을 바꿔줍니다.
3. 해당 로직을 마치고 이전 값보다 최소값이면 값을 갱신시켜주고 로직 1로 회귀합니다.
import java.util.Scanner;
public class Main {
static int N, M;
static char[][] map;
static int[][] copyMap;
static int result = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner scr = new Scanner(System.in);
StringBuffer sb = new StringBuffer();
String input;
result = Integer.MAX_VALUE;
N = scr.nextInt();
M = scr.nextInt();
scr.nextLine();
map = new char[N][M];
for (int i = 0; i < N; i++) {
// input = scr.next();
input = scr.nextLine();
map[i] = input.toCharArray();
}
for (int i = 0; i <= N - 8; i++) {
for (int j = 0; j <= M - 8; j++) {
copyMap = new int[8][8];
copy(j, i);
// if (copyMap[i][j] == 0) {
// copyMap[i][j] = 1;
// paintBoard(1);
// copy(j, i);
// paintBoard(0);
// } else {
// copyMap[i][j] = 0;
// paintBoard(1);
// copy(j,i);
// paintBoard(0);
// }
copyMap[0][0] = (copyMap[0][0] + 1) % 2;
paintBoard(1);
copy(j, i);
paintBoard(0);
}
}
System.out.println(result);
}
public static void copy(int x, int y) {
// System.out.println("X: " + x + ", Y: " + y);
int width = x + 8;
int height = y + 8;
for (int i = y; i < height; i++) {
for (int j = x; j < width; j++) {
if (map[i][j] == 'W') {
copyMap[i - y][j - x] = 1; // 1은 White
} else {
copyMap[i - y][j - x] = 0; // 0은 Black
}
}
}
}
public static void paintBoard(int count) {
for (int j = 0; j < 7; j++) {
if (copyMap[j][0] == copyMap[j + 1][0]) {
// System.out.println(copyMap[j][0] + ", " + copyMap[j + 1][0]);
copyMap[j + 1][0] = (copyMap[j + 1][0] + 1) % 2;
count++;
}
if (count > result) {
return;
}
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
if (copyMap[i][j] == copyMap[i][j + 1]) {
copyMap[i][j + 1] = (copyMap[i][j + 1] + 1) % 2;
count++;
}
if (count > result) {
return;
}
}
}
if (count < result) {
result = count;
}
}
}
위 코드를 보시면 주석이 하나 보입니다.
if (copyMap[i][j] == 0) {
copyMap[i][j] = 1;
paintBoard(1);
copy(j, i);
paintBoard(0);
} else {
copyMap[i][j] = 0;
paintBoard(1);
copy(j,i);
paintBoard(0);
}
코드가 중복되고 불필요한 코드가 많습니다. 해서 해당 코드를 나름 간단하게 짜려고 노력한 흔적이니 그냥 남겼습니다.
저에겐 큰 고민이었기에
'알고리즘(Java) > Simulation' 카테고리의 다른 글
[백준, 시뮬레이션, JAVA] P.1021 회전하는 큐 (0) | 2020.02.04 |
---|
Comments