코딩테스트/백준

[백준 15685번] 드래곤 커브

seung_ho_choi.s 2025. 5. 29. 18:02
728x90

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

package implement;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Impl15685 {
    static int N;

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

    // 동 북 서 남 (0,1,2,3)
    static int[] dx = {0, -1, 0, 1};
    static int[] dy = {1, 0, -1, 0};

    static int result = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        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 dir = Integer.parseInt(st.nextToken());
            int g = Integer.parseInt(st.nextToken());
            map[y][x] += 1;
            slove(y, x, dir, g);
        }

        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if (isSquare(j, i)) {
                    result++;
                }
            }
        }


        System.out.println(result);

    }

    private static boolean isSquare(int x, int y) {
        if(map[x][y]==0){
            return false;
        }

        if(map[x][y+1] ==0){
            return false;
        }

        if(map[x+1][y] ==0){
            return false;
        }

        if(map[x+1][y+1] ==0){
            return false;
        }

        return true;
    }

    private static void slove(int x, int y, int dir, int g) {
        int gCnt = (int) Math.pow(2, g);
        List<Integer> dirs = new ArrayList<>();
        int nextX = x;
        int nextY = y;
        dirs.add(dir);

        int compare = 1;
        for (int k = 1; k < gCnt + 1; k++) {
            nextX += dx[dirs.get(k-1)];
            nextY += dy[dirs.get(k -1)];
            if (nextX < 0 || nextX >= 101 || nextY < 0 || nextY >= 101) {
                break;
            }
            map[nextX][nextY] += 1;

            // 세대 바꿀떄 dir 바꿔서 추가
            if (k == 1 || compare * 2 == k) {
                List<Integer> tempDirs = new ArrayList<>();
                for (int i= dirs.size()-1; i>=0; i-- ) {
                    int eDir = dirs.get(i);
                    int newDir = eDir + 1 >= 4 ? 0 : eDir + 1;
                    tempDirs.add(newDir);
                }
                dirs.addAll(tempDirs);
                compare = k;
            }

        }
    }
}

 

 

문제를 처음에 잘못 접근해서 시간이 조금 걸렸다. 하지만 골드 3 치고는 그렇게 어렵지 않았다.

핵심은 세대가 진행될수록 이전 세대의 방향들을 시계방향으로 회전한 후 반대 순서로 붙이는 것이다. 이를 구현하기 위해 List를 활용해 방향 정보를 저장하고, 각 세대마다 이를 갱신해주면 된다.
단, 갱신 시점은 2의 배수로 세대가 증가하면서 일정한 패턴을 따르기 때문에, 이를 고려해 로직을 구성하는 것이 중요하다.

728x90