코테

코테_Baekjoon_15685_드래곤커브

강용민 2023. 8. 21. 15:57

https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

 

접근 방법

해당 문제는 규칙을 찾으면 쉽게 풀 수 있는 문제였다. 물론 규칙을 찾는게 쉽진 않지만... 그래도 힌트는 있다. 그래프를 봤을 때 드래곤 커브의 끝점을 기준(N)으로 (N+1)번째와 (N-1)번째는 연관이 있다는 것은 쉽게 알아차릴 수 있다.

드래곤 커브는 끝점을 기준으로 90도를 회전시키므로 N+1번째 점의 방향은 N-1번째의 방향에서 90도를 회전시킨 방향이다.

 

방향을 보면 1 -> 2, 2 -> 3, 3 -> 0, 0 -> 1로 변환한다.

이를 코드로 작성하면 다음과 같다.

 

코드

public class Main {
	static boolean[][] map = new boolean[101][101];
	// 방향 {>,^,<,v}
	static int[][] dirType = { { 1, 0 }, { 0, -1 }, { -1, 0 }, { 0, 1 } };

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int answer = 0;
		int N = Integer.parseInt(br.readLine());
		for (int n = 0; n < N; n++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int D = Integer.parseInt(st.nextToken());
			int G = Integer.parseInt(st.nextToken());
			
			dragonCurve(x,y,D,G);
		}
		
		for(int y = 0; y < 100; y++) {
			for(int x = 0; x < 100; x++) {
				if(map[y][x] && map[y][x+1]&& map[y+1][x]&&map[y+1][x+1]) answer++;
			}
		}
		
		System.out.println(answer);
	}

	public static void dragonCurve(int x, int y, int D, int G) {
		List<Integer> curves = new ArrayList<>();
		curves.add(D);

		for (int g = 1; g <= G; g++) {
			for (int curve = curves.size() - 1; curve >= 0; curve--)
				curves.add((curves.get(curve) + 1) % 4);
		}

		map[y][x] = true;
		for (int curve : curves) {
			x += dirType[curve][0];
			y += dirType[curve][1];
			map[y][x] = true;
		}
	}
}

'코테' 카테고리의 다른 글

코테_백준_17070_파이프 옮기기 1  (0) 2023.08.17
코테_Baekjoon_21608_상어초등학교  (0) 2023.08.07
코테_BAEKJOON_14501_퇴사  (0) 2023.07.31
코테_Chapter01_그리디  (0) 2022.07.19
백준_No1075_나누기  (0) 2022.07.05