반응형
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 배열을 선언한다. 그런데 이번 문제에서 보면 방문 확인 배열을 선언하지 않고 풀 수 있다. 그러나 메모리를 줄이고자 했던 일이 작은 실수로 문제를 푸는 시간을 증가하는 일이 발생할 수 있다. 사실 내가 한 실수다. 코딩 절차는 다음과 같다.
- 범위 확인 및 방문 여부 확인
- 가능할 때, 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 |
반응형
'백준' 카테고리의 다른 글
[백준] 2583 - 영역 구하기, C++ (0) | 2020.01.07 |
---|---|
[백준] 11403 - 경로 찾기, C++ (0) | 2020.01.07 |
[백준] 1012 - 유기농 배추, C++ (0) | 2020.01.06 |
[백준] 2667 - 단지번호붙이기, C++ (0) | 2020.01.06 |
[백준] 2606 - 바이러스, C++ (알고리즘 정리 예정) (0) | 2020.01.06 |
댓글