ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 숨바꼭질 3
    Algorithm/BOJ 2020. 2. 5. 17:36

    [13549] 숨바꼭질 3

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

    • 수빈이의 위치 N
    • 동생의 위치 K
    • 동생을 찾는 가장 빠른 시간을 구하는 문제
    • 수빈이가 할 수 있는 행동(위치 : X)
    • 1. 걷기 : X + 1  또는 X - 1로 이동 (1초)
    • 2. 순간이동 : 2 * X로 이동(0초)

     

     

    Solution

    • 덱을 사용한 BFS 풀이 방법
    • 걷기와 순간이동의 가중치(시간)가 다르기 때문에 덱을 사용해 순간 이동은 덱의 앞에, 걷기는 덱의 뒤에 넣는 방법도 생각해 볼 수 있다.

     

     

    소스코드

    import java.util.Arrays;
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.Scanner;
    
    public class Main {
    	int[] count;
    
    	public void go() {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int m = sc.nextInt();
    		count = new int[100001];
    		Arrays.fill(count, -1);
    		bfs(n);
    		System.out.println(count[m]);
    	}
    
    	public void bfs(int n) {
    		Deque<Integer> q = new LinkedList<>();
    		q.offer(n);
    		count[n] = 0;
    		while (!q.isEmpty()) {
    			int cur = q.poll();
    			if (cur * 2 <= 100000 && count[cur * 2] < 0) {
    				q.addFirst(cur * 2);
    				count[cur * 2] = count[cur];
    			}
    			if (cur - 1 >= 0 && count[cur - 1] < 0) {
    				q.addLast(cur - 1);
    				count[cur - 1] = count[cur] + 1;
    			}
    			if (cur + 1 <= 20 && count[cur + 1] < 0) {
    				q.addLast(cur + 1);
    				count[cur + 1] = count[cur] + 1;
    			}
    		}
    	}
        
    	public static void main(String[] args) {
    		Main main = new Main();
    		main.go();
    	}
    }

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 숨바꼭질 2  (0) 2020.02.07
    [BOJ] 숨바꼭질 4  (0) 2020.02.06
    [BOJ] 스타트와 링크  (0) 2020.02.05
    [BOJ] 단어 수학  (0) 2020.02.04
    [BOJ] 리모컨  (0) 2020.02.04

    댓글

Designed by Tistory.