[BOJ] 1697 숨바꼭질.java

전영서·2021년 8월 27일
0

Algorithm

목록 보기
1/89

1. 문제

2. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 M = Integer.parseInt(st.nextToken());
        boolean[] visited = new boolean[100001];
		//bfs위한 큐 생성
        Queue<Integer> queue = new LinkedList<Integer>();
		//첫 원소 입력 및 방문 처리
        queue.add(N);
        visited[N] = true;
        int count = 0; //이동횟수
        while(!queue.isEmpty()){
            int size = queue.size();
			//해당 이동횟수의 갯수만큼
            while(size!=0){
                int curr = queue.poll();
                size--;
				//위치와 동생의 위치가 같아지면 출력하고 정지
                if(curr == M){
                    System.out.println(count);
                    return;
                }
				//위치는 -1,+1,*2가 있다.
                int temp1 = curr-1;
                int temp2 = curr+1;
                int temp3 = curr*2;
				//범위 벗어나지 않고 방문 안했을경우에만 큐에 넣어준다.
                if(temp1>=0 && !visited[temp1]){
                    queue.add(temp1);
                    visited[temp1] = true;
                }
                if(temp2<=100000 && !visited[temp2]){
                    queue.add(temp2);
                    visited[temp2] = true;
                }
                if(temp3<=100000 && !visited[temp3]){
                    queue.add(temp3);
                    visited[temp3] = true;
                }
            }
            //한 사이클 끝나면 다음 횟수로
            count++;
        }
        br.close();
    }
}

3.Review

BFS와 메모이제이션을 사용하여서 풀었다. 전형적이었다.

profile
꾸준히 성실하게

0개의 댓글