본문 바로가기
BaekJoon/C++

1697 : 숨바꼭질 (C++)

by GrayChoi 2021. 2. 8.
반응형

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net


전에 처음 이 문제를 봤을 때 문제에 어떻게 접근을 해야 할 지 몰라 안풀고 있었는데

오늘 그냥 한번 부딪혀 보자라는 마음으로 문제를 풀어봤다.

BFS로 풀어봤다.

#include<iostream>
#include<queue>

using namespace std;

int N, K;
int map[100001];
bool visit[100001];

int dx[3] = {1, -1, 2};

void bfs(int x) {
    queue<int> q;
    visit[x] = true;
    map[x] = 0;

    q.push(x);

    while(!q.empty()) {
        x = q.front();

        if(x == K) // 동생의 위치를 만나는 경우 while 탈출
            break;

        q.pop();

        for(int i = 0; i < 3; i++) {
            int nx = 0;
            if(dx[i] == 2) { // 순간이동을 하는 경우
                nx = x * dx[i];
            } else { // 그냥 걷는 경우
                nx = x + dx[i];
            }

            if(nx >= 0 && nx < 100001) {
                if(visit[nx] == false) {
                    q.push(nx);
                    visit[nx] = true;
                    map[nx] = map[x] + 1;
                }
            }
        }

    }
}

int main() {
    cin >> N >> K;

    if(N >= K) { // 수빈이의 위치가 더 앞에 있는 경우 or 같은 자리인 경우
        cout << N - K << endl;
    } else {
        bfs(N);
        cout << map[K] << endl;
    }

    return 0;
}
반응형

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

2206 : 벽 부수고 이동하기 (C++)  (0) 2021.02.09
7569 : 토마토 (C++)  (0) 2021.02.08
1926 : 그림 (C++)  (0) 2021.02.08
2576 : 홀수 (C++)  (0) 2021.02.05
2583 : 영역 구하기 (C++)  (0) 2021.02.05

댓글