티스토리 뷰

Coding/acmicpc

백준 9663:숨바꼭질

이끼대백과 2018. 3. 26. 15:48

백준 9663번 숨바꼭질 문제입니다. 이번 문제도 BFS 알고리즘을 사용해서 풀었어요. DFS로 해결하려면 힘들 것 같아요. 만약 testCase가 50000 1일 경우에 정말 많은 스택공간이 필요하기 때문에 재귀함수는 메모리초과가 날 것 같고, 스택을 이용하면 시간초과가 날것 같기에.. BFS를 활용하는게 좋아보아요. 처음 구현할 때, 1에서 출발하면 *2 나 +1이 중복되서 체크하는 데 문제가 있을거라고 생각했었는데, 어차피 둘다 이동 횟수는 1증가해서 상관 없을 것 같네요..

밑에는 제 코드입니다.

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
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
vector<int> visited;  //방문체크와 동시에 횟수 측정
int BIG;
bool isSafe(int pos) {  //범위 체크
    if (pos<0 || pos > BIG + 1return false;
    else return true;
}
 
int main(void) {
    int N, K;
    cin >> N >> K;
    BIG = K > N ? K : N;  //큰 수를 찾아요
    queue<int> q;
    q.push(N); visited.resize(BIG + 2);  //큰 수 만큼 배열을 만들어요
    visited[N] = 1;
    while (!q.empty()) {
        int cur = q.front();
        if (cur == K) break;  //목적지 까지 도착하면 break;
        if (isSafe(cur * 2&& !visited[cur * 2&& cur < K) {//방문가능,방문하지 않았다면
            visited[cur * 2= visited[cur] + 1;  //방문체크 후
            q.push(cur * 2);  //큐에 삽입
        }
        if (isSafe(cur-1&& !visited[cur - 1]) {  //방문가능,방문하지 않았다면
            visited[cur - 1= visited[cur] + 1;  //방문체크 후
            q.push(cur - 1);  //큐에 삽입
        }
        if (isSafe(cur + 1&& !visited[cur + 1&& cur < K) {  //방문가능,방문하지 않았다면
            visited[cur + 1= visited[cur] + 1;  //방문체크 후
            q.push(cur + 1);  //큐에 삽입
        }
        
        q.pop();
    }
    cout << visited[K] - 1 << endl;
 
    return 0;
}
cs


'Coding > acmicpc' 카테고리의 다른 글

백준 6593:상범 빌딩  (0) 2018.04.16
백준 12851, 13549, 13913:숨바꼭질 시리즈.. feat.순간이동  (8) 2018.04.03
백준 7562:나이트의 이동  (0) 2018.03.26
백준 2644:촌수계산  (0) 2018.03.19
백준 1707:이분 그래프  (0) 2018.03.18
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함