코딩문제풀이/Baekjoon

[Java] 백준 15685번 : 드래곤 커브*

코딩하는 포메라니안 2022. 12. 13. 17:52

1. 문제

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

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

 

 

2. 풀이과정

문제에서 주어지는 x, y를 반대로 생각하는 게 편해서 x를 세로축, y를 가로축으로 생각하고 풀었습니다.

 

90도 회전하는 방법

1) x증가량 => y감소량 & x감소량 => y증가량

2) y증가량 => x증가량 & y감소량 => x감소량

따라서 nx = 끝점 - (y변화량), ny = 끝점 +(x변화량)이 된다.

 

다 구하면, 끝점을 업데이트 해주어야 한다.

끝점은 무조건 size번째에 오기 때문에 끝점을 dragon.get(size)에 있는 값으로 업데이트 해주고 90도 회전을 세대수만큼 반복한다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {

    static boolean map[][];
    static int dx[] = {0, -1, 0, 1}, dy[] = {1, 0, -1, 0};

    public static void simulation(int x, int y, int dir, int cnt){
        ArrayList<int[]> dragon = new ArrayList<>();
        int nx = x + dx[dir];
        int ny = y + dy[dir];
        map[x][y] = map[nx][ny] = true;
        dragon.add(new int[]{x, y});
        dragon.add(new int[]{nx, ny});
        x = nx;
        y = ny;

        for(int i=0; i<cnt; i++){
            int size = dragon.size();

            for(int j=0; j<size; j++){
                int[] now = dragon.get(j);
                nx = x + now[1] - y;
                ny = y - (now[0] - x);
                map[nx][ny] = true;
                dragon.add(new int[]{nx, ny});
            }
            x = dragon.get(size)[0];
            y = dragon.get(size)[1];
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        map = new boolean[101][101];
        int n = Integer.parseInt(br.readLine());

        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            int y = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            int dir = Integer.parseInt(st.nextToken());
            int cnt = Integer.parseInt(st.nextToken());
            simulation(x, y, dir, cnt);
        }

        //네점이 모두 true면 cnt++
        int result = 0;
        for(int i=0; i<100; i++){
            for(int j=0; j<100; j++){
                if(map[i][j] && map[i+1][j] && map[i+1][j+1] && map[i][j+1]){
                    result++;
                }
            }
        }
        System.out.println(result);
    }

}

 

 

결과