코테/백준

[백준/JAVA] 5014번: 스타트링크

imname1am 2023. 8. 17. 14:03
반응형

🔺 문제

 

5014번: 스타트링크

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

www.acmicpc.net

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.*;
import java.io.*;
 
public class Main {
    static int F,S,G,U,D;
    static int[] A;
    static int cnt = 0;
    static boolean isEnd = false;
    
    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());
        S = Integer.parseInt(st.nextToken());
        G = Integer.parseInt(st.nextToken());
        U = Integer.parseInt(st.nextToken());
        D = Integer.parseInt(st.nextToken());
        
        A = new int[F + 1];
        bfs(S);
        
        System.out.println(isEnd ? cnt : "use the stairs");
    }
    
    private static void bfs(int num) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(num);
        A[num] = 1; // 시작점 방문 표시
        
        while(!queue.isEmpty()) {
            int now = queue.poll(); // 현재 위치
            
            if(now == G) { // 현재 위치 = 도착점이면 종료
                isEnd = true;
                cnt = A[now] - 1; // 맨 처음 거 빼기
                return;
            }
            
            if(now + U <= F) { // 위층으로 올라갔을 때, F보다 작거나 같은 경우
                if(A[now + U] == 0) { // 방문하지 않은 지점이라면
                    A[now + U] = A[now] + 1; // 올라가서 값 업데이트
                    queue.add(now + U);
                }
            }
            
            if(now - D > 0) { // 아래층으로 내려갔을 때, 0보다 큰 경우
                if(A[now - D] == 0) { // 방문하지 않은 지점이라면
                    A[now - D] = A[now] + 1; // 내려가서 값 어데이트
                    queue.add(now - D);
                }
            }
        }
    }
}
cs
✅ 해결 아이디어
✔ BFS
1) 현재 위치 = 목표점 ⇨ 출력

2) 현재 위치 + 위로 이동한 값 <= 최고층 && 방문 X
    ⇨ [현재층 + 위쪽 이동]을 [현재층] + 1 값으로 업데이트하고 큐에 추가

3) 현재 위치 - 아래로 이동한 값 > 0 && 방문 X
    ⇨ [현재층 + 아래쪽 이동]을 [현재층] + 1 값으로 업데이트하고 큐에 추가

 


🔺 다른 풀이들

- 다들 비슷하심

 


💬 느낀 점

위로 올라간 횟수와 아래로 내려간 횟수의 조합..으로 문제를 풀 생각했는데

그냥 BFS로 탐색하는 문제였다...

 

인접 행렬 사용하지 않고, 그냥 배열을 사용하신 것도 기억해둬야할듯.

방문 처리를 배열의 값에 1을 더하는 식으로 하는 것도!

나 만날 이런 문제에서 감 못 잡음ㅠ

 

 

 

1회독 2회독 3회독 4회독 5회독
V 240508      

 

 

(+ 240508 2회독 : 33900KB, 188ms)

위 아래로 이동한 칸을 큐에 추가하며 누르는 버튼 수를 구하면 된다는 갈피는 잡았다만

누른 적 없는 칸을 큐에 추가해야 한다는 조건을 빠뜨려서 헤맸다..

코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.*;
import java.io.*;
 
public class Main {
    static int F,S,G,U,D;
    static int[] arr;
 
    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());   // 건물 총 층
        S = Integer.parseInt(st.nextToken());   // 강호 층
        G = Integer.parseInt(st.nextToken());   // 회사 층 (=목표 층)
        U = Integer.parseInt(st.nextToken());   // 위
        D = Integer.parseInt(st.nextToken());   // 아래
 
        arr = new int[F + 1];
        int answer = bfs();
 
        System.out.println(answer == -1 ? "use the stairs" : answer);
    }
 
    private static int bfs() {
        Queue<Integer> q = new ArrayDeque<>();
        q.add(S);
 
        arr[S] = 1;    // 강호 층 버튼 누르기
 
        while(!q.isEmpty()) {
            int now = q.poll();
 
            if(now == G) {  // 목표 층 G층 도착 시
                return arr[now] - 1;
            }
 
            if(now + U <= F) {  // 최고층 F층 아래에 있고
                if(arr[now + U] == 0) { // 방문한 적 없는 경우
                    arr[now + U] = arr[now] + 1;
                    q.add(now + U);
                }
            }
            if(now - D >= 1) {  // 최저층 1층 이상에 있고
                if(arr[now - D] == 0) { // 방문한 적 없는 경우
                    arr[now - D] = arr[now] + 1;
                    q.add(now - D);
                }
            }
        }
 
        return -1;  // 목표 층 도착 못 할 시 -1 출력
    }
}
 
cs

 

 


(참고)

✔ 풀이 참고

 

[BOJ] 백준 5014 - 스타트링크 (자바)

BFS...,,.,, BFS로 풀면 된다.다른 조건이 있을까 싶었는데. BFS로 전체 탐색하듯이 하면 된다. 시간초과 안남 풀이1. 시작점부터 큐에 넣어 up, down 이동경로를 다시 큐에 넣는다.2. 큐에서 나온 점이

zoonvivor.tistory.com

 

[백준 5014] 스타트링크 <Java>

 

velog.io

 

반응형