[문제] 백준 알고리즘 1697 (숨바꼭질)
> 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
N에서 M까지 이동하는데, 1초에 +1이나 -1이나 *2를 이동할 수 있다.
최소 시간을 구하는 문제, BFS 문제이다.
[문제 해결]
1. BFS를 위해 queue, while, visited를 사용한다.
2. queue에 초기값으로 시간, 위치 n을 push
3. 다음 이동 위치인 +1, -1, *2의 변수를 설정
+1일 경우는 최대 범위 이하만 만족하면 된다.
-1일 경우는 0 이상만 만족하면 된다.
*2일 경우는 최대 범위 +1이하만 만족하면 된다. (+1은 k가 홀수일 경우 포함)
4. 위의 조건을 만족하면, visited를 1, queue에 시간+1, 위치를 push
5. while queue하다가 위치가 k일 때 출력
[C++]
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
queue< pair<int, int> > q;
const int MAX = 1e5 + 1;
bool visited[MAX];
int n, k;
void solve_bfs() {
	q.push({ 0, n });
	visited[n] = 1;
	while (!q.empty()) {
		int cnt = q.front().first;
		int pos = q.front().second;
		q.pop();
		if (pos == k) {
			printf("%d", cnt);
			return;
		}
		int pos_p = pos + 1;
		int pos_m = pos - 1;
		int pos_d = pos * 2;
		if (pos_d <= k + 1) { // k가 홀수일 때를 고려
			if (!visited[pos_d]) {
				visited[pos_d] = 1;
				q.push({ cnt + 1, pos_d });
			}
		}
		if (0 <= pos_m) {
			if (!visited[pos_m]) {
				visited[pos_m] = 1;
				q.push({ cnt + 1, pos_m });
			}
		}
		if (pos_p <= k) {
			if (!visited[pos_p]) {
				visited[pos_p] = 1;
				q.push({ cnt + 1, pos_p });
			}
		}
	}
	return;
}
int main() {
	memset(visited, 0, sizeof(visited));
	scanf("%d %d", &n, &k);
	solve_bfs();
}
[Python]
import sys
from collections import deque
input = sys.stdin.readline
n, k = map(int, input().split())
MAX = 1e5
visited = [0] * int(MAX+1)
def solve_dfs():
    q = deque()
    q.append((0, n))
    visited[n] = 1
    while q:
        cnt, pos = q.popleft()
        pos_p, pos_m, pos_d = pos + 1, pos - 1, pos * 2
        if pos == k:
            print(cnt)
            return
        if pos_d <= MAX+1:
            if not visited[pos_d]:
                visited[pos_d] = 1
                q.append((cnt+1, pos_d))
        if pos_p <= MAX:
            if not visited[pos_p]:
                visited[pos_p] = 1
                q.append((cnt+1, pos_p))
        if 0 <= pos_m:
            if not visited[pos_m]:
                visited[pos_m] = 1
                q.append((cnt+1, pos_m))
solve_dfs()728x90
    
    
    
  '백준 알고리즘(BOJ)' 카테고리의 다른 글
| 백준 알고리즘 1956 (운동) - C++, Python (0) | 2019.10.16 | 
|---|---|
| 백준 알고리즘 2206 (벽 부수고 이동하기) - C++, Python (0) | 2019.10.16 | 
| 백준 알고리즘 14888 (연산자 끼워넣기) - C++, Python (0) | 2019.10.16 | 
| 백준 알고리즘 11404 (플로이드) - C++, Python (0) | 2019.10.16 | 
| 백준 알고리즘 7569 (토마토(3D)) - C++, Python (0) | 2019.10.16 | 
댓글