이번에 풀어본 문제는
백준 5014번 스타트링크 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class KH
{
int loc,cnt;
public KH(int loc, int cnt) {
this.loc = loc;
this.cnt = cnt;
}
}
public class Main {
static int [] move = new int[2];
static boolean [] visited;
static int F;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
F = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int G = Integer.parseInt(st.nextToken());
int U = Integer.parseInt(st.nextToken());
int D = Integer.parseInt(st.nextToken());
move[0] = U;
move[1] = -D;
visited = new boolean[F+1];
Queue<KH> q = new LinkedList<>();
q.add(new KH(S,0));
visited[S] = true;
int answer = 0;
boolean isDone = false;
while(!q.isEmpty())
{
KH cur = q.poll();
if(cur.loc == G)
{
isDone = true;
answer = cur.cnt;
break;
}
for(int idx = 0; idx < 2; idx++)
{
int next = cur.loc + move[idx];
if(!isValid(next) || visited[next]) continue;
visited[next] = true;
q.add(new KH(next,cur.cnt+1));
}
}
System.out.print(isDone ? answer : "use the stairs");
}
static boolean isValid(int x)
{
return x > 0 && x <= F;
}
}
목표 층까지 엘리베이터를 타고 이동하는데, 최소 이동 횟수를 구하는 문제입니다. bfs탐색을 활용하여 U,D 만큼 강호를 이동시키고 G에 도달했을 때 카운트값을 출력하면 됩니다. answer 값이 초기값과 같을 경우를 도달하지 못했다고 판단할 수 있지만, S와 G값이 동일한 경우가 존재하므로 boolean 타입의 변수를 통해 flag로 활용했습니다.
간단하고 재밌는 그래프탐색 문제였습니다!^^