PS/C++

[백준 15685] 드래곤 커브

siyamaki 2024. 7. 22. 14:07

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

 

삼성 B형에서 나올법한 구현 문제이다.

 

지문이 좀 헷갈려서 아래 첨부된 그림을 보고 이해를 했다.

입력이 x, y로 되있는데 실제 좌표와 배열의 인덱스가 다르므로 arr[y][x]로 접근해야 했다.

d가 0, 1, 2, 3으로 동, 북, 서, 남 순서이다.

예제 몇 개를 보면 규칙이 보이는데 예제 1번의 4 2 1 3을 보면

4 2 1 3
북
서
남 서
남 동 남 서
1
2
3 2
3 0 3 2

전 세대의 이동이 다음 세대 이동의 뒷부분과 일치한다는 것이다.

다른 사람들의 풀이는 이전 이동을 뒤집어서 1씩 더한 값을 이용했는데

나는 이전 이동의 앞 1/2부분은 그대로 넣고 뒤 1/2부분은 2씩 더한 후 mod 4를 해서 다음 이동에 넣어줬다

좌표는 중복되어도 되고, 입력의 결과가 배열의 크기를 벗어나는 부분이 없다는 조건이 있어 추가적인 고려는 하지 않았다.

 

주의할 점은 좌표의 경계가 1 ~ 100이 아닌 0 ~ 100이라는 점이다.

 

#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false); cout.tie(nullptr); cin.tie(nullptr);
using namespace std;
int N;
bool arr[101][101];
// 동 북 서 남
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
int main() {
    FASTIO

    cin >> N;
    for(int i = 0; i < N; i++) {
        int x, y, d, g; cin >> x >> y >> d >> g;
        vector<int> v[g + 1];
        v[0].push_back(d);  // 0세대
        for(int k = 1; k <= g; k++) {    // 이동방향 넣고
            if(k == 1) {
                v[1].push_back((d + 1) % 4);  // 1세대
            } else if(k == 2) {
                v[k].push_back((d + 2) % 4);
                v[k].push_back((d + 1) % 4);
            } else {
                for(int l = 0; l < v[k - 1].size(); l++) {
                    if(l < v[k - 1].size() / 2) {
                        v[k].push_back(v[k - 1][l]);
                    } else {
                        v[k].push_back((v[k - 1][l] + 2) % 4);
                    }
                }
                for(int l = 0; l < v[k - 1].size(); l++) {
                    v[k].push_back(v[k - 1][l]);
                }
            }
        }
        arr[y][x] = true;
        for(int k = 0; k <= g; k++) {
            for(int j : v[k]) {
                y += dy[j];
                x += dx[j];
                arr[y][x] = true;
            }
        }
    }
    int res = 0;
    for(int i = 0; i <= 99; i++) {
        for(int j = 0; j <= 99; j++) {
            if(arr[i][j] && arr[i + 1][j] && arr[i][j + 1] && arr[i + 1][j + 1]) {
                res++;
            }
        }
    }
    cout << res;
}