백준 5014 - 스타트링크
Updated:
Java
5014 번 - 스타트링크
문제
접근 방법
한 점에서, 다른 한 점으로 갈 수 있는 최단 거리를 구하는 문제이다.
BFS는 한 점에 처음 도달하면, 그 위치까지 도달하는데 걸린 횟수가 최소인 최단거리이므로 이를 응용한다.
시작 점에서, 주어진 크기만큼의 상 / 하를 이동하며 방문할 때마다 queue에 넣고 방문하였다 표시한다. 이후 목표 층에 도달하면 그 위치가 최단 거리이므로, 그 횟수를 결과에 저장하고 BFS를 종료한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int f,s,g,u,d, result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
f = stoi(stk.nextToken()); // 총 층수
s = stoi(stk.nextToken()); // 현재 있는 곳
g = stoi(stk.nextToken()); // 목표
u = stoi(stk.nextToken()); // 한번에 위로 갈 수 있는 개수
d = stoi(stk.nextToken()); // 한번에 밑으로 갈 수 있는 개수
boolean[] vis = new boolean[f + 1];
boolean isOk = false;
Queue<int[]> queue = new LinkedList<int[]>();
queue.add(new int[] {s,0});
vis[s] = true;
int curN, cnt, nextN;
int[] q;
while(!queue.isEmpty()) {
q = queue.poll();
curN = q[0];
cnt = q[1];
if(curN == g) {
result = cnt;
isOk = true;;
break;
}
// 올라갈 수 있는지 체크
nextN = curN + u;
// 범위를 벗어나지 않았으며, 처음 방문한 장소이면
if(isIn(nextN) && !vis[nextN]) {
queue.add(new int[] {nextN, cnt + 1});
vis[nextN] = true;
}
// 내려갈 수 있는지 체크
nextN = curN - d;
if(isIn(nextN) && !vis[nextN]) {
queue.add(new int[] {nextN, cnt + 1});
vis[nextN] = true;
}
}
if(isOk)
System.out.println(result);
else
System.out.println("use the stairs");
br.close();
}
static boolean isIn(int num) {
if(1 <= num && num <= f)
return true;
return false;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}