알고리즘/시뮬레이션 & 구현

[백준/구현/C++] 3190번 뱀 (삼성 SW 역량 테스트 기출)

데메즈 2023. 1. 13. 11:16
728x90
반응형

https://www.acmicpc.net/workbook/view/1152

문제집: 삼성 SW 역량 테스트 기출 문제 (baekjoon)

www.acmicpc.net

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

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

문제 해결 방법

1. 현재 위치를 담을 queue를 만들고 현재위치를 표시한다
(사과를 먹었을 때는 몸이 길어져서 pop()을 하지않고, 먹지 않았을때는 맨 끝 위치를 pop() 해준다)
2. 현재의 방향을 저장할 변수를 선언한다
3. 뱀의 방향 전환에 필요한 배열을 만들어준다
4. L개의 방향 변환 정보가 끝나도 벽과 자신에 부딪히지 않았다면 현재 방향으로 쭉 간다

#include <iostream>
#include <queue>

using namespace std;

int n, k, l;
int map[101][101];
int dy[] = {1, 0, -1, 0}; // 오른쪽, 아래, 왼쪽, 위
int dx[] = {0, 1, 0, -1};
int t = 0; // 시간

bool check(int x, int y){
    if(x<=0 || x>n || y<=0 || y>n) // 벽과 부딪힌 경우
        return false;
    if(map[x][y] == 2) // 자신과 부딪힌 경우
        return false;

    return true;
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    queue<pair<int, char>> q;

    cin >> n >> k;
    for(int i=0; i<k; i++){
        int x, y;
        cin >> x >> y;
        map[x][y] = 1;
    }

    cin >> l;
    for(int i=0; i<l; i++){
        int x; char c;
        cin >> x >> c;
        q.push({x, c});
    }

    int x = 1, y = 1; // 현재 위치
    queue<pair<int, int>> now;
    now.push({x, y});
    int d = 0; // 현재 방향
    int nx, ny;

    while(1){

        int n = q.front().first;
        char c = q.front().second;
        q.pop();

        while(t != n){
            nx = x + dx[d];
            ny = y + dy[d];
            t++;

            if(!check(nx, ny)){ // 벽이나 자신과 부딪혔는지 확인
                cout << t;
                return 0;
            }

            now.push({nx, ny});
            if(map[nx][ny]!=1){ // 사과를 먹지 않은 경우
                int first = now.front().first;
                int second = now.front().second;
                map[first][second] = 0;
                now.pop();
            }
            map[nx][ny] = 2; // 현재 위치 표시
            x = nx;
            y = ny;
        }

        if(c == 'D'){
            if(d==3) d = 0;
            else d += 1;
        } else {
            if(d==0) d = 3;
            else d -= 1;
        }
    }

}


q가 비어있는 상태에서 q.front()를 호출해도 정상적으로 작동할까 궁금했는데

이처럼 쓰레기값이 들어가긴 하지만 조건에 맞아 잘 작동했다

728x90
반응형