-
BFS - 백준(1697) 숨바꼭질 - 배열의 인덱스를 이용한 BFS자료구조와 알고리즘/문제풀기 2024. 5. 6. 12:11
숨바꼭질
시간 제한메모리 제한제출정답맞힌 사람정답 비율2 초 128 MB 247267 72751 46123 25.857% 문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입력 1 복사
5 17
예제 출력 1 복사
4
풀이
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static int n,k; static int[] check; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); k = sc.nextInt(); //시간 넘겨 줄 배열 선언 check = new int[100001]; if(n == k) { System.out.println(0); return; } //-1,+1 혹은 2*x해서 동생의 위치까지 감 // 둘은 0 혹은 100000사이에 위치 Queue<Integer> que = new LinkedList<>(); que.offer(n); while (!que.isEmpty()){ int now = que.poll(); int[] dir = {now-1,now+1,now*2}; for(int i=0; i<3;i++){ int newpos = dir[i]; if(newpos < 0 || newpos > 100000) continue; if(check[newpos] == 0){ check[newpos] = check[now]+1; que.offer(newpos); } } } System.out.println(check[k]); } }
1. 배열을 탐색
- dy,dx 등 이동 방향을 염두해야한다는 것
- 최단 거리, 시간 등을 찾는 거라면, 방문 시간을 저장하고, 최초 1회 방문시 이를 +1 하면서 넘겨야 한다는 것
'자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글
문제 풀이에 자주 사용하는 순열,조합 (0) 2024.05.11 BFS - 백준1194 달이 차오른다,가자 - 장애물 변동에서 탐색 (+테스트케이스 추가) (0) 2024.05.11 BFS - 백준(2178) 미로 찾기 - 4방향 탐색과 BFS (1) 2024.05.06 트리 - 백준(11725) 트리의 부모 찾기 - 트리의 표현과 탐색 (1) 2024.04.28 재귀 - 백준 15657 N과 M(8) - 중복 있는 조합 (1) 2024.04.28