문제링크 : https://www.acmicpc.net/problem/1697
이 문제는 분류가 BFS 문제로 되어있습니다.
지금까지 보았을 때, BFS문제는 여러가지 케이스가 있을 때, 이중 최단시간을 구하는 문제였습니다. 이 문제 또한 3개의 케이스가 있습니다(x+1, x-1, 2x).
최소 시도 횟수를 구하는 문제 입니다. 따라서 이번 trial 에서 할 수 있는 모든것을 다 시도한 후 다음 trial로 가야 합니다. 따라서 BFS의 반복문 안에 현재 Queue 의 size만큼 dequeue를 해 주었습니다.
이 문제를 풀 때 런타임 에러로인해 고통받았습니다. K의 최댓값이 100000이기 때문에 배열의 크기가 200000이면 충분할 것 이라고 생각 했었지만, K의 최댓값보다도 더 큰 값이 배열에 들어갈 수도 있었음을 인지하지 못하였습니다.
소스코드 :
이 문제는 분류가 BFS 문제로 되어있습니다.
지금까지 보았을 때, BFS문제는 여러가지 케이스가 있을 때, 이중 최단시간을 구하는 문제였습니다. 이 문제 또한 3개의 케이스가 있습니다(x+1, x-1, 2x).
최소 시도 횟수를 구하는 문제 입니다. 따라서 이번 trial 에서 할 수 있는 모든것을 다 시도한 후 다음 trial로 가야 합니다. 따라서 BFS의 반복문 안에 현재 Queue 의 size만큼 dequeue를 해 주었습니다.
이 문제를 풀 때 런타임 에러로인해 고통받았습니다. K의 최댓값이 100000이기 때문에 배열의 크기가 200000이면 충분할 것 이라고 생각 했었지만, K의 최댓값보다도 더 큰 값이 배열에 들어갈 수도 있었음을 인지하지 못하였습니다.
소스코드 :
| 
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 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 | 
#include <iostream> 
#include <vector> 
#include <string> 
#include <queue> 
#include <algorithm> 
using namespace std; 
int N, K; 
queue<int> q; 
bool cache[200002]; 
int Cal(int num, int x) { 
    if (num == 0) { 
        return x + 1; 
    } 
    else if (num == 1) { 
        return x - 1; 
    } 
    else { 
        return (2 * x); 
    } 
} 
void BFS(int x, int trial) { 
    while (!q.empty()) { 
        int qSize = q.size(); 
        for (int i = 0; i < qSize; i++) { 
            int cur = q.front(); 
            if (cur == K) { 
                cout << trial << endl; 
                return; 
            } 
            q.pop(); 
            if (cache[cur]) { 
                continue; 
            } 
            else 
                cache[cur] = true; 
            for (int j = 0; j < 3; j++) { 
                int res = Cal(j, cur); 
                if (res >= 0 && res < 200002) 
                    q.push(res); 
            } 
        } 
        trial++; 
    } 
} 
int main() { 
    ios_base::sync_with_stdio(false); 
    cin.tie(0); 
    cin >> N >> K; 
    q.push(N); 
    BFS(N, 0); 
} | cs | 
댓글
댓글 쓰기