요깨비's LAB

[백준, Simulation, JAVA] P.1018 체스판 다시 칠하기 본문

알고리즘(Java)/Simulation

[백준, Simulation, JAVA] P.1018 체스판 다시 칠하기

요깨비 2019. 12. 17. 19:30

체스판이라는 것을 명심하고 풀이에 들어가야 합니다. 상하좌우 색깔이 서로 달라야 합니다. 단순하게 한줄에 최적의 경우만
찾아서는 안됩니다.

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);
}

 코드가 중복되고 불필요한 코드가 많습니다. 해서 해당 코드를 나름 간단하게 짜려고 노력한 흔적이니 그냥 남겼습니다.
저에겐 큰 고민이었기에

Comments