티스토리 뷰

알고리즘/백준

[백준] 5014번 스타트링크

머어하지 2018. 10. 24. 22:32

생각

Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q1000/Q5014.java 1층 부터 시작되는 건물의 3개의 층의 위치가 주어진다. 이중 F층은 꼭대기 층이고, S층은 현재 있는 층이며, G층은 도착해야할 층 수이다. 엘레베이터에는 2개의 버튼이 있다. U와 D 이 위로와 아래로 가는 버튼은 각 각 정해진 층수 만큼만 이동이 가능하다. 각 층의 위치 정봐와 U와 D의 이동 가능한 층수 정보가 주어졌을 때 S층에서 G층으로 갈 수 있으면 최소 누른 버튼 수를 갈 수 없다면 use the stairs를 출력하여라.


처음 생각

BFS 탐색을 통해 U와 D버튼을 눌렀을 경우 Queue에 넣어주면서 탐색을한다.

▶ U와 D버튼이 0일 수도 있기 때문에 0이 아니라면 넣어주어야한다. 0일경우 계속해서 Queue에 들어가기 때문이다.


다음 생각

위의 방식으로 하면 시간초과가 나오게된다. 

▶ 생각해보면 이유는 나름 간단하다. 반복작업이 많아지기 때문이다. 예를들어 1000층에 가야하고 U와 D가 각 1칸 씩이라고 생각하면 처음 queue에 S층을 넣어주고 위와 아래 1개씩 또 Queue에 넣어 준다. 그럼 아래로 들어간 Queue중 하나는 또 원래의 1000층으로 오게된다. 이러한 중복 작업때문에 Queue의 찾는 작업이 중단 될 때까지 계속적으로 2배의 정보들이 늘어나게된다.


다다음 생각

따라서 위와 같은 문제를 해결하기 위해 방문 배열을 만들어 이미 방문했던 층일 경우는 탐색을 하지 않도록 하였다.

▶ 이미 방문한곳은 어차피 이전에 했던 작업(U와 D)를 똑같이해서 나아가기 때문이다.


방안

1) 시간 초과가 나올경우 제거할 수 있는 탐색을 가지치기해줌으로서 문제를 해결 할 수 있다.


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
56
57
58
59
60
61
package baekjoon.q1000;
 
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
public class Q5014 {
    static int[] arr,move;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // F(0) S(1) G(2)
        // 건물에서 가장 높은 층은 F층이다.
        arr = new int[3];
        for(int i=0;i<3;i++)
            arr[i] = sc.nextInt();
        // U(0) D(1)
        move = new int[2];
        move[0= sc.nextInt();
        move[1= sc.nextInt();
        visited = new boolean[arr[0]+1];
        solve();
    }
    
    static boolean[] visited;    
    private static void solve() {
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(arr[1], 0)); // S층 넣어주기
        visited[arr[1]] = true;
        boolean flag = false;
        while(!queue.isEmpty()) {
            Pair t = queue.poll();
            // 도착 가능하면
            if(t.n==arr[2]) {
                flag = true;
                System.out.println(t.cnt);
                break;
            }
            
            // 위층 보내기 && 최상층 넘어가지 않으면 && 방문 한적 없으면
            if(move[0]!=0&&t.n+move[0]<=arr[0]&&!visited[t.n+move[0]]) {
                visited[t.n+move[0]]=true;
                queue.add(new Pair(t.n+move[0], t.cnt+1));
            }
            // 아래층 보내기 && 최하층 밑으로 가지 않으면 && 방문 한적 없으면
            if(move[1]!=0&&t.n-move[1]>0&&!visited[t.n-move[1]]) {
                visited[t.n-move[1]]=true;
                queue.add(new Pair(t.n-move[1], t.cnt+1));
            }
        }
        if(!flag) System.out.println("use the stairs");
    }
    
    static class Pair{
        int n,cnt;
        Pair(int n,int cnt){
            this.n= n;
            this.cnt = cnt;
        }
    }
}
 


'알고리즘 > 백준' 카테고리의 다른 글

[백준] 3184번 양  (0) 2018.10.25
[백준] 12886번 돌 그룹  (0) 2018.10.25
[백준] 3019번 테트리스  (0) 2018.10.24
[백준] 15658번 연산자 끼워넣기(2)  (0) 2018.10.24
[백준] 14391번 종이 조각  (1) 2018.10.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday