기술 블로그

셔틀버스 본문

알고리즘 문제/Programmers

셔틀버스

parkit 2020. 6. 24. 13:06
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/17678






핵심은 다음 2가지이다.


1. 모든 버스를 사용하였고(n만큼), 모든 손님을 모두 다 태웠을 경우에는 마지막에 탄 사람의 시간(=Last)에서 1을 빼준다.

2. 위의 경우가 아니라면, 버스의 마지막 운행시간이 정답이다.





주의할 것은 35~37번 째 줄에서 break를 통해 time이 계산되기 전에 빠져 나오는 경우도 생각하자.






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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.io.*;
import java.util.*;
 
public class Solution {
 
    static BufferedReader br;
    static BufferedWriter bw;
    static  PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    
    /* 마지막 버스까지 꽉찼다면, 마지막 크루의 시간 - 1
     * 꽉 차지 않았다면, 마지막 버스의 시간이 정답이다.
     */
    static String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        int len = timetable.length;
        StringTokenizer st;
        //st = new StringTokenizer(br.readLine());
        
        for(int i=0; i<len; i++) {
            st = new StringTokenizer(timetable[i], ":");
            int H = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            pq.add(60*+ M);
        }
        
        int bus = 0, time = 9*60, Last = 0, people = 0;
        while(!pq.isEmpty() && bus < n) {
            people = 0;
            while(!pq.isEmpty() && time >= pq.peek() && people < m) {
                Last = pq.peek();
                pq.remove();
                ++people;
            }
            // 버스의 수가 n이 됐거나 손님이 없다면
            if(++bus == n || pq.isEmpty()) {
                break;
            }
            time += t;
        }
        
        // 버스를 다 사용했고, 사람마저도 모두 다 꽉찼다면
        if(people == m && bus == n) {
            time = Last - 1;
        }
        
        int hour = time / 60;
        int minute = time % 60;
 
        if(hour < 10) {
            answer += "0" + Integer.toString(hour) + ":";
        }
        else {
            answer += Integer.toString(hour) + ":";
        }
        
        if(minute == 0) {
            answer += "00";
        }
        else if(minute < 10) {
            answer += "0" + Integer.toString(minute);
        }
        else {
            answer += Integer.toString(minute);
        }
        
        return answer;
    }
    
    public static void main(String[] args) throws IOException  {
        // TODO Auto-generated method stub
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        //st = new StringTokenizer(br.readLine());
        
        int n = 1, t = 1, m = 1;
        
        String[] timetable = {
            "23:59"
        };
        
        System.out.println(solution(n, t, m, timetable));
            
        bw.write("\n");
        bw.flush();
        bw.close();
    }
}
 
class pair {
    int first, second;
    pair(int a, int b) {
        this.first = a;
        this.second = b;
    }
}
 
class tuple {
    int first, second, third;
    tuple(int a, int b, int c) {
        this.first = a;
        this.second = b;
        this.third = c;
    }
}
 
class PQ implements Comparable<PQ> {
    int first, second;
    
    PQ(int f, int s) {
        this.first = f;
        this.second = s;
    }
    
    public int compareTo(PQ p) {
        if(this.first < p.first) {
            return -1// 오름차순
        }
        else if(this.first == p.first) {
            if(this.second < p.second) {
                return -1;
            }
        }
        
        return 1
        // 이미 this.first가 더 큰 것이 됐으므로, 1로 해준다.
        // -1로 하면 결과가 이상하게 출력됨.
    }
}
cs










728x90
반응형

'알고리즘 문제 > Programmers' 카테고리의 다른 글

올바른 괄호의 개수  (0) 2020.06.25
베스트앨범  (0) 2020.06.24
예산  (0) 2020.06.24
N으로 표현  (0) 2020.06.24
외벽 점검  (0) 2020.04.03