Java

[백준 15685] 드래곤 커브(JAVA)

iheeeee6-6 2023. 5. 30. 14:57
728x90

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

 

15685번: 드래곤 커브

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

www.acmicpc.net

 

 

처음에 이해하기 어려운 문제였다ㅠㅠ

  • 0: x좌표가 증가하는 방향 (→)
  • 1: y좌표가 감소하는 방향 (↑)
  • 2: x좌표가 감소하는 방향 (←)
  • 3: y좌표가 증가하는 방향 (↓)

백준의 예시를 보면 

1세대 : (0)

2세대 : 1세대 +1 =1 따라서,

3세대 : 2세대 +1 =2 , 1세대 +1 = 1 따라서, ← 과

4세대 : 3세대 +1 = 3, 2세대 +1= 2, 1세대 +1 = 1 따라서, ↓과  ← 과 

 

이렇게 방향이 바뀌게 된다.

 

따라서 가장 처음의 방향에다가 세대마다 추가되는 방향을 list에 넣고,

시작점에서 부터 방향에 따라 주어지는 끝점에 1로 표시를 해주면 된다!

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {

	static int[][] arr = new int[101][101];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		StringTokenizer st;
		for (int i = 0; i < n; i++) {
			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());

			draw(x, y, getDirections(d, g));

		}

		int result = 0;
		for (int i = 0; i < 100; i++) {
			for (int j = 0; j < 100; j++) {
				if (arr[i][j] == 1 && arr[i + 1][j] == 1 && arr[i + 1][j + 1] == 1 && arr[i][j + 1] == 1)
					result++;
			}
		}

		System.out.println(result);

	}

	static ArrayList<Integer> getDirections(int d, int g) {
		ArrayList<Integer> list = new ArrayList<>();
		list.add(d);
		while (g-- > 0) {
			for (int i = list.size() - 1; i >= 0; i--) {
				int dd = (list.get(i) + 1) % 4;
				list.add(dd);
			}
		}
		return list;
	}

	static void draw(int x, int y, ArrayList<Integer> list) {
		arr[x][y]=1;
		while (!list.isEmpty()) {
			int dd = list.get(0);
			switch (dd) {
			case 0:
				arr[++x][y] = 1;
				break;
			case 1:
				arr[x][--y] = 1;
				
				break;
			case 2:
				arr[--x][y] = 1;
				break;
			case 3:
				arr[x][++y] = 1;
				break;
			}
			list.remove(0);
		}
	}
}