문제 설명
풀이
당연히 최소거리니까 DP가 아니라면 BFS문제이다.
일반적으로 최소거리를 찾으면 끝내는게 아니라, 최소거리가 나올때 마다 카운트를 추가해야한다
다소 어려운 방법으로 풀었지만, minTime 보다 time[now]가 크면 이미 조건 불만족이니 더 안간다
그리고 이렇게 계속해서 조건부적으로 시간을 체크해주면 가장 빠르게 할 수있다
코드
import java.util.*;
import java.io.*;
class Main {
static int N, K;
static int[] time = new int[100001];
static int minTime = 987654321;
static int count = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
if (N >= K) {
System.out.println((N-K) + "\n1");
return;
}
bfs();
System.out.println(minTime + "\n" + count);
}
static void bfs() {
Queue<Integer> q = new LinkedList<Integer>();
q.add(N);
time[N] = 1;
while (!q.isEmpty()) {
int now = q.poll();
// now 방문 시간이 최소 시간보다 크면 뒤는 더 볼 필요 없음
if (minTime < time[now]) return;
for (int i=0; i<3; i++) {
int next;
if (i == 0) next = now + 1;
else if (i == 1) next = now - 1;
else next = now * 2;
if (next < 0 || next > 100000) continue;
if (next == K) {
minTime = time[now];
count++;
}
// 첫 방문이거나 (time[next] == 0)
// 이미 방문한 곳이어도 같은 시간에 방문했다면 (time[next] == time[now] + 1)
// 경우의 수에 추가될 수 있기 때문에 Queue 에 한번 더 넣어줌
if (time[next] == 0 || time[next] == time[now] + 1) {
q.add(next);
time[next] = time[now] + 1;
}
}
}
}
}
https://www.acmicpc.net/problem/12851
'개발합시다. > JAVA 알고리즘 문제풀이' 카테고리의 다른 글
BOJ_13549 숨바꼭질 3 [Java] (G5) (0) | 2021.11.24 |
---|---|
BOJ_17142 연구소 3 [Java] (G4) (0) | 2021.11.22 |
BOJ_1303 전투[Java](S1) (0) | 2021.11.18 |
BOJ_1743 음식물 쓰레기[Java] (S1) (0) | 2021.11.18 |
BOJ_7576 토마토 [Java] (S1) (0) | 2021.11.16 |