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