백준 3190번: 뱀

danbibibi·2022년 10월 8일
0

문제

문제 바로가기> 백준 3190번: 뱀

풀이

뱀의 시작점을 나타내기 위해 sy, sx 좌표를, 끝점을 나타내기 위해 ey, ex 좌표를 이용했다. 또, 뱀이 있는 곳은 해당 위치에서 다음으로 이동할 경우 이동될 방향을 기록해주었다! 방향을 기록할 때는 dir+1로 기록했는데, 이는 상(-1,0)의 index가 0이기 때문이다.

#include<iostream>
#include<queue>
#define MAX 101
#define EMPTY -1
using namespace std;

int N, K, L;
int snake[MAX][MAX];
bool apple[MAX][MAX];
int sy=0, sx=0, ey=0, ex=0, dir=1; // 뱀의 정보 

int dy[] = {-1, 0, 1, 0}; // 상 우 하 좌 
int dx[] = {0, 1, 0, -1};

queue<pair<int, int>> info; // 방향 변환 정보 

void input(){
    cin >> N >> K;
    int r, c, t; char d;
    for(int i=0; i<K; i++){
        cin >> r >> c;
        apple[r-1][c-1] = true;
    }
    cin >> L;
    for(int i=0; i<L; i++){
        cin >> t >> d;
        if(d=='L') info.push({t, 0}); // 'L' 외쪽으로 90'
        else info.push({t, 1}); // 'D' 오른쪽으로 90'
    }
}

void solution(){
    int ans=0;
    snake[0][0] = 2;
    while(1){
        
        ans++;
        
        // 1. 뱀 이동
        sy+=dy[dir];
        sx+=dx[dir];
        if(sy<0 || sy>=N || sx<0 || sx>=N || snake[sy][sx]) break; // 벽 또는 자기자신의 몸과 부딪히는 경우
        if(apple[sy][sx]) apple[sy][sx] = 0; // 사과가 있는 경우, 사과를 먹음
        else{ // 사과가 없는 경우, 몸길이를 줄임
            int d = snake[ey][ex]-1; // +1 해서 저장했으므로 
            snake[ey][ex] = 0;
            ey+=dy[d];
            ex+=dx[d];
        }

        // 2. 방향 변화
        if(!info.empty() && info.front().first == ans){
            if(info.front().second) dir = (dir+1)%4; // 오른쪽으로 90'
            else dir = (dir+4-1)%4; // 외쪽으로 90'
            info.pop();
        }
        snake[sy][sx] = dir+1; // 방향 저장 (상이 0이므로 +1 해서 저장)
    }
    cout << ans;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    solution();
}
profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글