jemin0619 2024. 3. 7. 20:21

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

 

15685번: 드래곤 커브

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

www.acmicpc.net

 

문제를 보고 아 이건 배열 돌리고 돌린 배열을 원본에 잘 붙이고 이를 반복하면 되겠다는 생각이 들어 구현을 시작했다. 근데 다시 생각해보면 이렇게 할 경우 플레 4 이상 문제를 풀어본 적은 없지만 아마 그 정도 난이도가 되지 않을까 싶었다. 

돌리고 그 차이만큼 배열을 당겨서 붙여넣고... 결국 한 번 구현했지만 실패하고 답지를 확인했다.

https://velog.io/@skyepodium/백준-15685-드래곤-커브

 

백준 15685 드래곤 커브

규칙을 찾는 문제 저는 스택을 사용했습니다. 1. 드래곤 커브는 세가지 속성을 가집니다. 1) 시작 점 2) 시작 방향 3) 세대 즉, K(K > 1)세대 드래곤 커브는 `K-1세대 드래곤 커브`를 `끝 점을 기준으로

velog.io

보자마자 너무 놀랐다. 3시간동안 끙끙대던 문제인데 이런 규칙을 이용해 해결할 수 있다니...

삼성 역량테스트 문제는 이런 빡구현 문제가 많아서 참 쉽지 않다...

코드에서 내 아이디어로 작성된건 getAns 말고 없다는 점이 참 슬프다

#include <bits/stdc++.h>
using namespace std;

//????

bool board[103][103];
int dy[]={0,-1,0,1};
int dx[]={1,0,-1,0};
vector<int> dragon;
int end_x, end_y;
int n;

int getAns(){
    int ret=0;
    for(int i=0;i<100;i++)
        for(int j=0;j<100;j++)
            if(board[i][j] && board[i][j+1] && board[i+1][j] && board[i+1][j+1]) ret++;
    return ret;
}

void make_generation(vector<int>&dragon){
    int size = (int)dragon.size();
    for(int i=size-1;i>=0;i--){
        int dir=(dragon[i]+1)%4;
        end_y+=dy[dir];
        end_x+=dx[dir];
        board[end_y][end_x]=true;
        dragon.push_back(dir);
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>n;
    while(n--){
        int x,y,d,g; cin>>x>>y>>d>>g;
        dragon.clear();
        board[y][x]=true;
        end_x=x+dx[d]; 
        end_y=y+dy[d];
        board[end_y][end_x]=true;
        dragon.push_back(d);
        for(int i=0;i<g;i++) make_generation(dragon);
    }
    cout<<getAns();
    return 0;
}