본문 바로가기

Coding Test

백준 15685 드래곤 커브

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

 

15685번: 드래곤 커브

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <stack>

using namespace std;


//우상좌하 순
int ny[4]={0, -1, 0, 1};
int nx[4]={1, 0, -1, 0};


bool map[101][101];





int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;
    int ans = 0;

    cin >> n;

    for (int N = 0; N < n; N++) {

        int x, y, d, g;
        vector<int> timestamp;
        stack<int> st;

        cin >> y >> x >> d >> g;

        map[x][y] = true;

        //0세대
        timestamp.push_back(d);
        st.push(d);

        //1세대부터 n세대까지
        for (int gen = 1; gen <= g; gen++) {

            while (!st.empty()) {
                int cur = st.top();
                st.pop();

                timestamp.push_back((cur + 1) % 4);

            }

            for (int i = 0; i < timestamp.size(); i++) {
                st.push(timestamp[i]);
            }

        }

        //해당 타임스탬프에 칠하기

        pair<int, int> cur = {x, y};
        for (int cnt = 0; cnt < timestamp.size(); cnt++) {
            map[cur.first + ny[timestamp[cnt]]][cur.second + nx[timestamp[cnt]]] = true;
            cur = {cur.first + ny[timestamp[cnt]], cur.second + nx[timestamp[cnt]]};
        }



    }



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


    cout << ans;

    return 0;
}

 

timestamp에는 앞으로 연결할 드래곤 커브의 방향을 저장한다.

 

입력 시 d는 (우 상 좌 하) 순으로 반시계 방향이다.

반면 드래곤 커브를 그릴 때는 시계 방향으로 그린 뒤 이어붙인다.

  

(아래 숫자는 ny, nx의 index임(우상좌하 순))

   0세대 : 0

   1세대 : 0 1

   2세대 : 0 1 2 1

   3세대 : 0 1 2 1 2 3 2 1

 

이는 규칙을 찾아보니 반시계방향으로 그린 후 역순으로 이어붙인 것과 같았다.

 

따라서 다음과 같은 방법으로 timestamp를 채웠다.

  1. timestamp를 모두 stack에 push한다.

  2. 이들을 하나씩 꺼내면서 timestamp에 저장한다.

  

위 과정을 세대의 수 만큼 반복하면 해당 드래곤 커브의 경로가 완성된다.

주어진 좌표에서 시작하여 해당 경로를 쫒아가면서 그리면 완성이다.

 

이후 map을 전수조사하면서 1*1의 정사각형의 개수를 세면 정답을 출력할 수 있다.

 

'Coding Test' 카테고리의 다른 글

백준 5639 이진 검색 트리  (2) 2024.03.31
백준 9342 염색체  (0) 2024.03.29
백준 1277 발전소 설치  (0) 2024.03.27
백준 16139 인간-컴퓨터 상호작용  (0) 2024.03.26
백준 1774 우주신과의 교감  (0) 2024.03.25