본문 바로가기
Algorithm/Baekjoon

Baekjoon 5014 스타트링크 JAVA

by Hunveloper 2022. 4. 30.
728x90
 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

문제

강호는 코딩 교육을 하는 스타트업 스타트링크에 지원했다. 오늘은 강호의 면접날이다. 하지만, 늦잠을 잔 강호는 스타트링크가 있는 건물에 늦게 도착하고 말았다.

스타트링크는 총 F층으로 이루어진 고층 건물에 사무실이 있고, 스타트링크가 있는 곳의 위치는 G층이다. 강호가 지금 있는 곳은 S층이고, 이제 엘리베이터를 타고 G층으로 이동하려고 한다.

보통 엘리베이터에는 어떤 층으로 이동할 수 있는 버튼이 있지만, 강호가 탄 엘리베이터는 버튼이 2개밖에 없다. U버튼은 위로 U층을 가는 버튼, D버튼은 아래로 D층을 가는 버튼이다. (만약, U층 위, 또는 D층 아래에 해당하는 층이 없을 때는, 엘리베이터는 움직이지 않는다)

강호가 G층에 도착하려면, 버튼을 적어도 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오. 만약, 엘리베이터를 이용해서 G층에 갈 수 없다면, "use the stairs"를 출력한다.

입력

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

출력

첫째 줄에 강호가 S층에서 G층으로 가기 위해 눌러야 하는 버튼의 수의 최솟값을 출력한다. 만약, 엘리베이터로 이동할 수 없을 때는 "use the stairs"를 출력한다.

풀이

2022.03.06 - [Algorithm/Baekjoon] - Baekjoon 1697 숨바꼭질 JAVA

 

Baekjoon 1697 숨바꼭질 JAVA

1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈

hunucho.tistory.com

위의 내용에서 +1, -1로 움직이는 것이 아닌 입력되는 U, D만큼 움직이는 방식이다.

다만 이 문제에서는 빌딩보다 위로 갈 수 없기에, 움직이는 위치를 검사하여 F보다 높은 값은 탐색하지 않는다.

코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int f=Integer.parseInt(st.nextToken()), s=Integer.parseInt(st.nextToken()), ans=-1;
		int g=Integer.parseInt(st.nextToken()), u=Integer.parseInt(st.nextToken()), d=Integer.parseInt(st.nextToken());
		Queue<int []>q = new LinkedList<int[]>();
		boolean [] chk = new boolean [f+1];
		q.add(new int[] {s,0});
		chk[s]=true;
		while(q.size()>0) {
			int [] cur=q.poll();
			int floor=cur[0], cnt=cur[1];
			// 처음 들어오는 위치가 갈려는 위치일수도 있기에, 시작시 층수를 판단함
			if(floor==g) {
				ans=cnt;
				break;
			}
			// 현재층에서 U층 버튼을 눌렸을때, 이 범위는 건물 안에 있어야함
			if (floor + u <= f) {
				if (!chk[floor + u]) {	// 방문하지 않은 층이라면 방문
					q.add(new int[] { floor + u, cnt + 1 });
					chk[floor + u] = true;
				}
			}
			// 위와 마찬가지로 내려가는 층을 눌렸을때 이 범위는 1층보다 크거나 같아야함 
			if (floor - d >= 1) {
				if (!chk[floor - d]) {
					q.add(new int[] { floor - d, cnt + 1 });
					chk[floor - d] = true;
				}
			}
		}
		if(ans==-1)	// bfs탐색안에서 갈려는 층에 도착하지 못했다면 출력
			System.out.println("use the stairs");
		else
			System.out.println(ans);
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 8980 택배 JAVA  (0) 2022.05.03
Baekjoon 1094 막대기 JAVA  (0) 2022.04.30
Baekjoon 12931 두 배 더하기 JAVA  (0) 2022.04.30
Baekjoon 14940 쉬운 최단거리 JAVA  (0) 2022.04.30
Baekjoon 14426 접두사 찾기 JAVA  (0) 2022.04.30

댓글