티스토리 뷰

알고리즘/백준

[BAEKJOON] 13549 숨바꼭질 3

응애~ 개발자 2022. 12. 20. 15:19
728x90
반응형

문제 요약

  • 알고리즘 분류: BFS
  • 난이도: Gold5
  • 문제내용:
    • 위치가 X일때 X - 1, X + 1 이동하면 1초 X * 2는 0초 걸린다.
    • 현재위치 N일때 K까지 이동하는데 최소 시간을 구해라
 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

문제풀이

   이번에는 문제 유형은 그래프 탐색 관련 문제이다.  다이스트라 알고리즘으로도 풀수 있는데 그보다 구현이 더 쉬운 BFS로 풀수 있다. BFS 알고리즘 관련 내용은 여기에서 확인 해보면 된다.

문제 접근 방법

 일반 적인 아래 코드 처럼 BFS 풀면 틀릴수가 있다.

from collections import deque

N, K = map(int, input().split())
location = [0] * (100001)
queue = deque([N])
while queue:
    now = queue.popleft()
    if now == K: break
    fx = now - 1
    # x - 1로 이동할 경우
    if 0<= fx <= 100000 and location[fx] == 0:
        location[fx] = location[now] + 1
        queue.append(fx)
    
    # X + 1로 이동할 경우
    fx = now + 1
    if 0<= fx <= 100000 and location[fx] == 0:
        location[fx] = location[now] + 1
        queue.append(fx)
    
    # X * 2로 순간 이동할 경우
    fx = now * 2
    if 0<= fx <= 100000 and location[fx] == 0:
        location[fx] = location[now]
        queue.append(fx)    

print(location[K])

  그 이유는 x * 2 부분이 0초라는 점이다. 1초이면 위에 코드 처럼 작성해도 맞출수 있지만 0초 이면 다시 방문 할때 이전 값보다 이동한 시간이 더 적을수가 있는 점이다 그래서 visited 체크하는 대신 지금 여기까지 온 시간이 이전 시간보다 작을 경우로 변경하면 맞출수가 있다. 그럼 값이 변경 된 경우를 정리하면 아래와 같다.

  1.  이동한 위치가 0 ~ 100,000 인 경우
  2. 이동한 위치 방문 하지 않을 경우
  3. 이동한 위치가 이전 이동한 시간 보다 짧을경우

위 3가지 경우 일때만 생각하고 BFS 알고리즘 작성 하면된다.

 

Code

Python

from collections import deque

N, K = map(int, input().split())
location = [-1] * 100001
location[N] = 0
queue = deque([N])
while queue:
    now = queue.popleft()
    if now == K: break
    
    # (X - 1, X + 1) 이동할 경우
    for fx in (now - 1, now + 1):
        if 0<= fx <= 100000 and (location[fx] == -1 or location[now] < location[fx]):
            location[fx] = location[now] + 1
            queue.append(fx)        
    
    # X * 2로 순간 이동할 경우
    fx = now * 2
    if 0< fx <= 100000 and (location[fx] == -1 or location[now] < location[fx]):
        location[fx] = location[now]
        queue.append(fx)    
        
print(location[K])

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
		
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(N);
		int[] location = new int[100001];
		Arrays.setAll(location, i -> -1);
		location[N] = 0;
		int now, fx;
		while(!queue.isEmpty()) {
			now = queue.poll();
			
			if(now == K) break;
			fx = now - 1;
			if((0 <= fx && fx <= 100000) && (location[fx] == -1 || location[now] < location[fx])) {
				location[fx] = location[now] + 1;
			    queue.add(fx);				
			}
			fx = now + 1;
			if((0 <= fx && fx <= 100000) && (location[fx] == -1 || location[now] < location[fx])) {
				location[fx] = location[now] + 1;
			    queue.add(fx);				
			}
			
			fx = now * 2;
			if((0 <= fx && fx <= 100000) && (location[fx] == -1 || location[now] < location[fx])) {
				location[fx] = location[now];
			    queue.add(fx);				
			}
			
		}
		System.out.println(location[K]);
	}

}

 

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]1753 최단경로 - Python  (0) 2022.12.23
[BAEKJOON] 11404 플로이드  (0) 2022.12.21
[BAEKJOON] 1967 트리의 지름 - Python  (0) 2022.12.19
[BAEKJOON] 2630 색종이 만들기 - JAVA  (0) 2022.12.16
[BAEKJOON] 9465 스티커  (0) 2022.12.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함