ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 15685] 드래곤 커브
    PS/C++ 2024. 7. 22.

    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;
    }

    'PS > C++' 카테고리의 다른 글

    [백준 13701] 중복 제거  (0) 2025.02.24
    [백준 16455] K번째 수 찾는 함수  (0) 2024.07.25
    [백준 14890] 경사로  (0) 2024.07.18
    [백준 1744] 수 묶기  (0) 2024.07.18
    [백준 1766] 문제집  (0) 2024.07.18

    댓글

Designed by Tistory.