본문 바로가기
백준

[백준] 1697 - 숨바꼭질, C++

by 황인태(intaehwang) 2020. 1. 6.
반응형

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

 

1697번: 숨바꼭질

문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지

www.acmicpc.net

 본 문제는 USACO US Open 2007 Contest Silver 2번 문제다. 대부분 이런 문제들은 거리를 계산하는 배열과 방문을 확인하는 bool 배열을 선언한다. 그런데 이번 문제에서 보면 방문 확인 배열을 선언하지 않고 풀 수 있다. 그러나 메모리를 줄이고자 했던 일이 작은 실수로 문제를 푸는 시간을 증가하는 일이 발생할 수 있다. 사실 내가 한 실수다. 코딩 절차는 다음과 같다.

  1. 범위 확인 및 방문 여부 확인
  2. 가능할 때, queue에 push ( ※ 초기값 방문에 대한 실수를 조심하자!)
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
#include <cstdio>
#include <queue>
 
using namespace std;
 
int main() {
    int d[200001= {0};
    int n, m;
    scanf("%d %d"&n, &m);
    queue<int> q;
    q.push(n);
    d[n] = 1// 초기값 방문 여부를 위해 인위적으로 1 증가
    while (!q.empty()) {
        int now = q.front();
        q.pop();
        // 뒤로 한 칸 갈 경우
        if (now-1 >= 0 && d[now-1== 0) {
            d[now-1= d[now] + 1;
            q.push(now-1);
        }
        // 앞으로 한 칸 갈 경우
        if (now+1 <= 200000 && d[now+1== 0) {
            d[now+1= d[now] + 1;
            q.push(now+1);
        }
        // 순간이동 할 경우
        if (now*2 <= 200000 && d[now*2== 0) {
            d[now*2= d[now] + 1;
            q.push(now*2);
        }        
    }
    // 인위적으로 1을 증가하였기 때문에 -1
    printf("%d", d[m]-1);
    return 0;
}
cs
반응형
Buy me a coffeeBuy me a coffee

댓글