728x90
문제
https://www.acmicpc.net/problem/1697
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
현재 위치에서 -1, +1, 또는 *2 위치로 이동할 수 있고, 목표는 최소 시간을 계산하는 것이므로 BFS를 사용
접근 방법
- 그래프 탐색: 이 문제는 그래프 탐색 문제로 볼 수 있습니다. 각 위치를 노드로, 이동 가능한 위치를 간선으로 간주합니다.
- BFS 사용: BFS(너비 우선 탐색)는 최단 경로를 찾는 데 효과적이므로 BFS를 사용합니다.
구현
BFS 알고리즘
- 시작 위치를 큐에 넣고 방문 표시를 합니다.
- 큐에서 위치를 하나씩 꺼내고, 현재 위치가 목표 위치인지 확인합니다.
- 목표 위치가 아니면, 다음 가능한 위치들을 큐에 추가하고, 방문 표시를 합니다.
- 목표 위치에 도달하면 현재까지 이동한 횟수를 반환합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static boolean[] visited = new boolean[100001];
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());
System.out.println(bfs(N, K));
}
public static int bfs(int start, int goal) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{start, 0});
visited[start] = true;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int value = current[0];
int steps = current[1];
if (value == goal) {
return steps;
}
int[] nextPositions = new int[]{value - 1, value + 1, value * 2};
for (int next : nextPositions) {
if (next >= 0 && next < visited.length && !visited[next]) {
visited[next] = true;
queue.add(new int[]{next, steps + 1});
}
}
}
return 0;
}
}
메모리:23148kb 시간:176ms
728x90
'IT 개발 관련 > [Algorithm]' 카테고리의 다른 글
[백준] 1251번 : 단어 나누기 - Java (0) | 2024.06.22 |
---|---|
[백준] 18352번 : 특정 거리의 도시 찾기 - Java (0) | 2024.06.21 |
[백준] 1193번 : 분수찾기 - Java (0) | 2024.06.20 |
[백준] 2477번 : 참외밭 - Java (0) | 2024.06.19 |
[백준] 9655번 : 돌 게임 - Java (0) | 2024.06.16 |