유미의 기록들

[백준 3주차 - 17071] 숨바꼭질 5 (Java) 본문

코딩테스트 기록/알고리즘 문제

[백준 3주차 - 17071] 숨바꼭질 5 (Java)

지유미 2024. 4. 12. 21:30
728x90
반응형

📌 문제

 

 

📝 풀이과정

위 문제를 푸는 데 2가지 핵심로직이 있다

 

1) 수빈이와 동생이 같이 이동하면서 만났을 경우

 

2) 수빈이가 먼저 도착했지만, 동생과 홀수, 짝수가 맞았을 경우

ex) 수빈이는 2초에 20에 도착, 동생은 4초에 20에 도착해도 성립된다

수빈이는 +1, -1으로 이동할 수 있기 때문에 20(2초) → 21(3초) → 20(4초) 로 동생과 만날 수 있다

 

 

⚠️ 처음에 1)번째 상황만 생각해서 문제를 풀었기 때문에 틀렸다.....

 

💻 코드

import java.util.Scanner;
import java.io.*;
import java.util.*;

public class Main{
	static final int MAX=500000;
	static int[][] visited=new int[2][MAX+4]; //홀,짝을 맞추기 위해
	static boolean check=false;
	static int n,k;
	static int turn;

	static void bfs(int here){
		visited[0][here]=1;
		Queue<Integer> queue=new LinkedList<>();
		queue.add(here);

		turn=1;
		while(!queue.isEmpty()){
			k+=turn;
			if(k>MAX) break;
			
			if(visited[turn%2][k]>0){ //turn초(홀수or짝수)일때 동생위치k에 수빈이가 방문했다면
				check=true;
				break;
			}
			int qSize=queue.size(); //플러드필, 단계별로 분리하고 싶을때 
			for(int i=0;i<qSize;i++){
				int now=queue.poll();
				for(int next:new int[]{now-1, now+1, 2*now}){
					if(next<0 || next>MAX || visited[turn%2][next]>0) continue;
					visited[turn%2][next]=visited[(turn+1)%2][now]+1; //짝수에 방문했다면 그 전은 홀수
					if(next==k){ //동생위치와 수빈이위치가 같을 때
						check=true;
						break;
					}
					queue.add(next);
				}
				if(check) break;
			}
			if(check) break;
			turn++;
		}
		
	}
    public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		
		n=Integer.parseInt(st.nextToken());
		k=Integer.parseInt(st.nextToken());
		
		if(n==k){
			System.out.println(0);
			return;
		}
		bfs(n);
		
		if(check){
			System.out.println(turn);
		}
		else{
			System.out.println(-1);
		}
	}
}
728x90
반응형
Comments