Algorithm

백준_드래곤커브_15685

Young_J 2020. 11. 1. 23:41

//알고리즘

1.  시뮬레이션

2. 규칙을 찾아 해결하면 되는 문제

 -> 세대별로 규칙이있음 : 이전세대의 방향에 +1을하고 뒤에서부터 추가해주면 됨.

 -> ex )  0세대 : 1,     1세대 : 1/ 2    2세대 : 12 / 32 

3. 리스트를 사용하여 관리 -> 배열을 사용할 경우 방향값 추가하기가 어려움.

 

더보기
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 드래곤커브_15685 {

	static int K, map[][], ans;
	static int[] dr = { 0, -1, 0, 1 }; // 오 상 왼 하
	static int[] dc = { 1, 0, -1, 0 };

	static int[] ddr = { 0, 1, 1 };
	static int[] ddc = { 1, 1, 0 };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		map = new int[200][200];
		K = sc.nextInt();
		int[][] arr = new int[K][4];
		for (int i = 0; i < K; i++) {
			for (int j = 0; j < 4; j++) {
				arr[i][j] = sc.nextInt();
			}
		}

		for (int i = 0; i < K; i++) {
			cal(arr[i][0], arr[i][1], arr[i][2], arr[i][3]);
		}

		for (int r = 0; r < map.length; r++) {
			L: for (int c = 0; c < map[r].length; c++) {
				if (map[r][c] == 1) {
					for (int k = 0; k < 3; k++) {
						int nr = r + ddr[k];
						int nc = c + ddc[k];

						if (map[nr][nc] != 1) continue L;
					}
					ans++;
				}
			}
		}

//		print(map);
		System.out.println(ans);
	}

	private static void print(int[][] map) {
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}

	}

	private static void cal(int c, int r, int dir, int g) {
		map[r][c] = 1;

		List<Integer> list = new ArrayList<Integer>();
		list.add(dir);

		for (int i = 0; i < g; i++) {
			for (int j = list.size() - 1; j >= 0; j--) {
				list.add((list.get(j) + 1) % 4);
			}
		}

		int nr = r;
		int nc = c;

		for (int i = 0; i < list.size(); i++) {
			nr += dr[list.get(i)];
			nc += dc[list.get(i)];

			map[nr][nc] = 1;
		}

	}

}