[JAVA] 15685 - 드래곤 커브 💛3: 기하 문제라면 당황하지 말고 규칙을 찾아보자.

2026. 4. 14. 18:20·Problem Solve

들어가며

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

세대별로 전 세대의 모양을 시계방향으로 돌려서 끝점에 붙혀가며 도형을 그렸을 때, 정사작형이 총 몇개 있는지 개수를 구하는 문제였다.

본문으로

처음 봤을 때 너무 막막했다. 이러한 기하 느낌의 문제를 풀어본 적이 많이 없었을 뿐더러 특히 문제에서 요구하는 세대별 변화를 좌표이동 값으로 나타내기가 너무 어려웠다.

좌표이동의 규칙이 뭐가 있을까??? 하고 계에에에에속 그려봤는데 뭔가 보이는 것 같으면서도? 너무 구현하기가 어려웠다...

 

결국 다른 분들의 힌트를 받아, 방향의 규칙을 찾고 좌표의 증감을 나타내라는 힌트를 받았다. 좌표이동의 규칙을 찾는 것이 아니라 방향의 변화 규칙을 찾으니 비교적 로직을 쉽게 구할 수가 있었다. 문제에서 0,1,2,3이 각각 x,y가 증감하는 값이라고 지정해준 값을 활용해서 방향 리스트를 만들어본다면,


0세대에서 시작 방향이 0이라면 방향 리스트는:

  • 0

1세대는 기존 방향을 뒤에서부터 보면서 각각 +1 mod 4 해준 걸 뒤에 붙인다. 왜냐하면 시계 방향 90도 회전 = 방향 번호 +1 (mod 4) 이기 때문이다.

예를 들어:

0세대

[0]

1세대

기존 [0]을 뒤집어서 보면 [0],  각각 +1 → [1]
붙이면: [0, 1]

2세대

기존 [0, 1]을 뒤집으면 [1, 0], 각각 +1 → [2, 1]
붙이면: [0, 1, 2, 1]

3세대

기존 [0, 1, 2, 1]을 뒤집으면 [1, 2, 1, 0], 각각 +1 → [2, 3, 2, 1]
붙이면: [0, 1, 2, 1, 2, 3, 2, 1]

이 방향 리스트대로 점을 찍으면 드래곤 커브가 완성된다. 

즉 방향 리스트를 구해서 규칙대로 드래곤 커브를 그려준 다음 정사각형을 갯수를 카운팅 해주는 로직을 아래처럼 구성해볼 수가 있다.

public class Main {

    static boolean[][] visited = new boolean[101][101];

    // 방향: 0(→), 1(↑), 2(←), 3(↓)
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, -1, 0, 1};

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            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());

            drawDragonCurve(x, y, d, g);
        }

        int answer = countSquares();
        System.out.println(answer);
    }

    static void drawDragonCurve(int x, int y, int d, int g) {
        ArrayList<Integer> dirs = new ArrayList<>();
        dirs.add(d);

        // 세대 확장
        for (int gen = 1; gen <= g; gen++) {
            for (int i = dirs.size() - 1; i >= 0; i--) {
                dirs.add((dirs.get(i) + 1) % 4);
            }
        }

        // 시작점 표시
        visited[y][x] = true;

        // 방향대로 이동하며 점 표시
        for (int dir : dirs) {
            x += dx[dir];
            y += dy[dir];
            visited[y][x] = true;
        }
    }

    static int countSquares() {
        int count = 0;

        for (int y = 0; y < 100; y++) {
            for (int x = 0; x < 100; x++) {
                if (visited[y][x] &&
                        visited[y][x + 1] &&
                        visited[y + 1][x] &&
                        visited[y + 1][x + 1]) {
                    count++;
                }
            }
        }

        return count;
    }
}

마무리하며

알고리즘 대회가 아니라면, 기하 문제는 사실 기하 문제인 "척" 하는 규칙찾기 문제라고 많이들 부른다.

앞으로도 도형을 좌표상에서 다루는 문제가 나온다면 당황하지 말고, 하나씩 그려보며 규칙을 찾는 방법에 최선을 다하자!!

'Problem Solve' 카테고리의 다른 글

[JAVA] 1912 - 연속합 🩶2 : 정답을 보면 간단해보여도, 빠르게 떠올리지 못한 문제 + 백준 섭종 발표 다음날...(개가 짖어도 기차는 간다!)  (0) 2026.04.16
[JAVA] 2632 - 피자판매 💛2 : 값이 아닌 경우의 수를 저장하자. + 원형 자료구조는 선형 자료구조로 피자!  (0) 2026.04.15
[JAVA] 17143 - 낚시왕 💛1 : 영감을 주는 시뮬레이션 문제 (왕복은 실제로 이동하는 것이 아니다!)  (0) 2026.04.09
[JAVA] 17825 - 주사위 윷놀이 💛2: 한땀한땀 만들어야하는 시뮬레이션 문제(집중하자...)  (0) 2026.04.07
[JAVA] 15662 - 톱니바퀴 (2) 💛5: 역할을 확실하게 나누자..! - 시뮬레이션 정복기  (0) 2026.04.01
'Problem Solve' 카테고리의 다른 글
  • [JAVA] 1912 - 연속합 🩶2 : 정답을 보면 간단해보여도, 빠르게 떠올리지 못한 문제 + 백준 섭종 발표 다음날...(개가 짖어도 기차는 간다!)
  • [JAVA] 2632 - 피자판매 💛2 : 값이 아닌 경우의 수를 저장하자. + 원형 자료구조는 선형 자료구조로 피자!
  • [JAVA] 17143 - 낚시왕 💛1 : 영감을 주는 시뮬레이션 문제 (왕복은 실제로 이동하는 것이 아니다!)
  • [JAVA] 17825 - 주사위 윷놀이 💛2: 한땀한땀 만들어야하는 시뮬레이션 문제(집중하자...)
노을을
노을을
진인사대천명
  • 노을을
    노을의 개발일기장
    노을을
  • 전체
    오늘
    어제
    • All (105) N
      • Java & Kotlin (16)
      • Problem Solve (46)
      • Spring (4)
      • Infra (3) N
      • DB (2)
      • Project (2)
        • SOMA (1)
        • OJik (1)
      • OpenSource (3)
      • Various Dev (23)
        • 우아한테크코스 (9)
        • Git&Github (2)
        • Unity (12)
      • Book (3)
      • Writing (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    contribute
    백준
    우아한테크코스
    java
    개발자
    코테
    github
    자바
    게임개발
    알고리즘
    유니티
    비트마스킹
    합격
    개발
    트러블슈팅
    코딩
    오픈소스
    8기
    프리코스
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
노을을
[JAVA] 15685 - 드래곤 커브 💛3: 기하 문제라면 당황하지 말고 규칙을 찾아보자.
상단으로

티스토리툴바