Be a developer

백준 1697 숨바꼭질 본문

알고리즘

백준 1697 숨바꼭질

중국고대사 2019. 4. 7. 22:26

앞에 문제들과 다르게 그래프처럼 생긴 문제들을 bfs로 푸는 것이 아니라, 그래프처럼 보이지 않는 문제를 그래프로 바꾸어 bfs로 푼다.

 

한 번 이동하는데 1초가 걸리므로 가중치를 1로 생각할 수 있다.

최대 위치가 10만이므로 bfs로 풀 수 있다.

 

처음에는 dist 배열만 선언해서 방문할 때마다 1을 더해주었다.

어짜피 한 번 방문하고 나서 이후에 방문하면 그 값이 더 커지므로 최소 비용을 만족할 수 없다고 생각했기 때문이다.

계속 틀렸다고 나와서 생각해보니, 첫 시작점도 dist는 0이기 때문에 계속 반복해서 방문하게 되는 문제가 발생한다.

이를 수정했더니 맞게 나왔다.

 

자세한 설명은 주석으로..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
 
//bool visit[100001];
int dist[100001];
 
int main(int argc, char** argv) {
    int n, k;
    cin >> n >> k;
 
    queue<int> q;
    q.push(n);
    //visit[n] = true;
    
    while (!q.empty()) {
        int position = q.front();
        q.pop();
 
        int prev = position - 1;
        int next = position + 1;
        int jump = position * 2;
 
        if (prev >= 0) {
            //if(!visit[prev]) 원래라면 이렇게 visit를 통해 한다.
            //prev != 0은 시작점 n이 0이기 때문에 이를 계속 방문하는 것을 막는다.
            if (dist[prev] == 0 && prev != n) {
                q.push(prev);
                dist[prev] = dist[position] + 1;
                //visit[prev] = true;
            }
        }
        if (next <= 100000) {
            if (dist[next] == 0 && next != n){
                q.push(next);
                dist[next] = dist[position] + 1;
                //visit[next] = true;
            }
        }
        if (jump <= 100000) {
            if (dist[jump] == 0 && jump != n) {
                q.push(jump);
                dist[jump] = dist[position] + 1;
                //visit[jump] = true;
            }
        }
    }
 
    printf("%d\n", dist[k]);
 
    return 0;
}
cs

'알고리즘' 카테고리의 다른 글

백준 13549 숨바꼭질 3  (0) 2019.04.08
백준 14226 이모티콘  (0) 2019.04.07
백준 7576 토마토  (0) 2019.04.07
백준 2178 미로 탐색  (0) 2019.04.07
백준 4963 섬의 개수  (0) 2019.04.07
Comments