백준 11060 - 점프 점프
Updated:
Java
11060 번 - 점프 점프
문제
접근 방법
BFS로 해결 시, 처음 도달하는 위치가 최단거리(최소비용)으로 도달하였다고 생각한다.
따라서 Boolean 방문여부 체크 배열을 통해 마지막 위치에 처음 도달하였을 때, 점프 회수를 구한다.
DP로 해결 시, dp[i]를 점프해야 하는 최소 횟수로 정의한다. dp[i]의 최소 횟수와 그 이후 들어온 횟수를 비교해서 min 값을 저장
코드 - BFS
import java.util.*;
import java.io.*;
public class Main {
static int n, result;
static int[] map;
static boolean[] vis;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
map = new int[n + 1];
vis = new boolean[n + 1];
stk = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
map[i] = stoi(stk.nextToken());
}
result = Integer.MAX_VALUE;
BFS();
if(result == Integer.MAX_VALUE) {
System.out.println(-1);
}
else {
System.out.println(result);
}
br.close();
}
static void BFS() {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {0,0});
vis[0] = true;
int[] q;
int curN, val, nextN, cnt;
while(!queue.isEmpty()) {
q = queue.poll();
curN = q[0];
cnt = q[1];
val = map[curN];
// 종료 조건
if(curN == n - 1) {
result = cnt;
return;
}
for(int i = 1; i <= val; i++) {
nextN = curN + i;
if(nextN < n && !vis[nextN]) {
vis[nextN] = true;
queue.add(new int[] {nextN, cnt + 1});
}
}
}
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
코드 - DP
import java.util.*;
import java.io.*;
public class Main {
static int n, result;
static int[] dp, map;
static final int MAX = 987654321;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
dp = new int[n + 1]; // 해당 인덱스까지 도달하는데 걸리는 최소 점프 수
map = new int[n + 1];
stk = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
map[i] = stoi(stk.nextToken());
}
Arrays.fill(dp, MAX);
dp[0] = 0;
for(int i = 0; i < n; i++) {
for(int j = 1; j <= map[i]; j++) {
if(i + j < n) {
dp[i + j] = Math.min(dp[i + j], dp[i] + 1);
}
}
}
if(dp[n - 1] == MAX) {
System.out.println(-1);
}
else {
System.out.println(dp[n - 1]);
}
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}