백준 드래곤 커브

KIMYEONGJUN·2026년 3월 22일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다.
둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다.
드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다.
x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10)
입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다.
방향은 0, 1, 2, 3 중 하나이고, 다음을 의미한다.
0: x좌표가 증가하는 방향 (→)
1: y좌표가 감소하는 방향 (↑)
2: x좌표가 감소하는 방향 (←)
3: y좌표가 증가하는 방향 (↓)

첫째 줄에 크기가 1×1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수를 출력한다.

내가 이 문제를 보고 생각해본 부분

좌표 및 방향 처리
문제에서 주어진 방향(0: →, 1: ↑, 2: ←, 3: ↓)을 기반으로 dx, dy 배열을 만들어 방향별 x,y 증분을 관리한다.
예를 들어, 0번 방향은 x가 1 증가(y는 그대로)하는 방향이다.
그리드 초기화 및 점 표시
101 × 101 크기의 boolean grid 배열을 사용해 드래곤 커브가 지나가는 모든 좌표를 기록한다.
드래곤 커브의 점들이 이 격자 위에 표시되어 나중에 정사각형 확인에 활용된다.
드래곤 커브 그리기 (drawDragonCurve 함수)
처음 시작 방향 d를 리스트에 넣고, 시작 점과 그 다음 점(0세대)까지 표시한다.
세대별로, 이전 세대의 방향 리스트를 역순으로 순회하며 각 방향을 시계 방향으로 90도 회전시킨 (기존 방향 + 1) % 4 새 방향을 끝 점에 이어 붙인다.
이 과정을 세대 수만큼 반복하며 새 점을 계속 표시한다.
curX, curY 변수로 현재 끝 점 위치를 갱신하며 점 위치 기록한다.
정사각형 개수 세기 (countSquares 함수)
격자 기준 (x,y)에서 오른쪽, 아래, 대각선 오른쪽 아래 점까지 모두 드래곤 커브 점이라면 1×1 정사각형을 형성하는 것이므로 카운트 증가한다.
0부터 99까지 반복하여 경계 이탈 없이 1×1 사각형 찾는다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 15685번 문제
public class Main1334 {
    // 방향 정의 (→, ↑, ←, ↓) -> 문제의 d 방향 대응(0:→, 1:↑, 2:←, 3:↓)
    static int[] dx = {1, 0, -1, 0};
    static int[] dy = {0, -1, 0, 1};
    static boolean[][] grid = new boolean[101][101]; // 드래곤 커브 점 표시
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");
            int x = Integer.parseInt(input[0]);
            int y = Integer.parseInt(input[1]);
            int d = Integer.parseInt(input[2]);
            int g = Integer.parseInt(input[3]);

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

        int result = countSquares();
        System.out.println(result);
        br.close();
    }

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

        // 0세대 표시
        grid[y][x] = true;

        // 0세대 끝 점 좌표
        int curX = x + dx[d];
        int curY = y + dy[d];
        grid[curY][curX] = true;

        // 세대별 방향 리스트 생성
        for (int gen = 1; gen <= g; gen++) {
            // 기존 방향 리스트를 역순으로 돌면서 +1 mod 4 방향 추가
            for (int idx = directions.size() - 1; idx >= 0; idx--) {
                int nd = (directions.get(idx) + 1) % 4;
                curX += dx[nd];
                curY += dy[nd];
                grid[curY][curX] = true;
                directions.add(nd);
            }
        }
    }

    static int countSquares() {
        int count = 0;
        // (x, y) 기준 네 꼭짓점 체크: (x,y), (x+1,y), (x,y+1), (x+1,y+1)
        for (int y = 0; y < 100; y++) {
            for (int x = 0; x < 100; x++) {
                if (grid[y][x] && grid[y][x+1] && grid[y+1][x] && grid[y+1][x+1]) {
                    count++;
                }
            }
        }
        return count;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글