[BOJ] 15685. 드래곤 커브

  • 메모리 : 13,320 KB
  • 시간 : 104 ms
  • 코드길이 : 1,632 B
  • 소요시간 : 2H 30M
  • 규칙까지는 찾아냈는데 이를 구현하는 과정에서 인터넷 검색을 해서 다른 사람들의 코드를 조금 참고하였다. 나중에 재풀이 한번 해야할 듯!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main_B_15685_드래곤커브 {

	static int size = 101, x, y, d, g;
	static boolean[][] map;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int N = Integer.parseInt(in.readLine());
		map = new boolean[size][size];
		int ans = 0;
		for (int n = 0; n < N; n++) {
			st = new StringTokenizer(in.readLine(), " ");
			x = Integer.parseInt(st.nextToken());
			y = Integer.parseInt(st.nextToken());
			d = Integer.parseInt(st.nextToken());
			g = Integer.parseInt(st.nextToken());
			draw(x, y, getDirections(d, g));
		}

		for (int i = 0; i < size - 1; i++) {
			for (int j = 0; j < size - 1; j++) {
				if (map[i][j] && map[i + 1][j] && map[i + 1][j + 1] && map[i][j + 1])
					ans++;
			}
		}

		System.out.println(ans);
	}

	private static void draw(int x, int y, List<Integer> directions) {
		map[x][y] = true;

		for (Integer dir : directions) {
			switch (dir) {
			case 0:
				map[++x][y] = true;
				break;
			case 1:
				map[x][--y] = true;
				break;
			case 2:
				map[--x][y] = true;
				break;
			case 3:
				map[x][++y] = true;
				break;
			}
		}
	}

	private static List<Integer> getDirections(int d, int g) {
		List<Integer> dir = new ArrayList<>();
		dir.add(d);

		while (--g >= 0) {
			for (int i = dir.size() - 1; i > -1; i--) {
				d = (dir.get(i) + 1) % 4;
				dir.add(d);
			}
		}

		return dir;
	}

}

Leave a comment