ALGORITHM/BOJ
[백준] 13549 숨바꼭질3
0298
2020. 11. 16. 21:06
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
2020-11-16
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main13549 {
public static int N, K, answer;
public static int dx[] = { 2, -1, 1};
public static Queue<int[]> q;
public static boolean vtd[];
public static void solve() {
loop: while (!q.isEmpty()) {
int tmp[] = q.poll();
int x = tmp[0];
int y = tmp[1];
for (int i = 0; i < dx.length; i++) {
int nx = 0;
int ny = 0;
if (i != 0) {
nx = x + dx[i];
ny += (y + 1);
} else {
nx = x * dx[0];
ny = y;
}
if (nx < 0 || nx > 100000 || ny > answer)
continue;
if (nx == K) {
answer = ny;
break loop;
} else if (!vtd[nx] && ny < answer) {
q.add(new int[] { nx, ny });
}
vtd[nx] = true;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
K = sc.nextInt();
vtd = new boolean[100001];
q = new LinkedList<>();
q.add(new int[] { N, 0 });
vtd[N] = true;
answer = 987654321;
if (N == K)
answer = 0;
else
solve();
System.out.println(answer);
}
}
[백준] 1697 숨바꼭질
www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을..
void2017.tistory.com
위의 숨바꼭질과 문제가 똑같다. 다만 조건 중에 2*X의 위치로 이동하는 경우 0초로 계산된다.
이 부분 때문에 틀렸었는데, 단순하게 -1 -> +1 -> 2로 계산하는 순서를 바꿔서, 2 -> -1 -> +1로 계산하니 통과가 됐다. 2의 가중치?가 가장 적어서 그렇다.
애초에 바로 수빈이와 동생이 만났을 때 while문을 끝내는 것이 아니라, 각각 이동한 방법대로 따로 값을 출력받아 최솟값을 찾았으면, 안 틀렸을 것이다.
알고리즘 분류에 '다익스트라'와 '0-1 BFS' 가 있었다. 나중에 두 알고리즘을 공부하고 다시 풀어봐야겠다.