[프로그래머스] 카카오_셔틀버스 (자바 풀이)

문제

https://programmers.co.kr/learn/courses/30/lessons/17678?language=java 

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] "18:00"

programmers.co.kr

풀이

str2time

우선 입력으로 들어온 String을 정수로 변환해 주는 함수를 작성했다. 간단하게 split() 함수를 이용해 시간과 분을 나누어서 계산했다.

main

ArrayList에 시간 스케쥴을 저장하고 오름차순으로 정렬했다. 버스는 9시에 처음 출발한다고 했으니 busStartTime은 540으로 설정했다. 이후 n번의 버스 출발동안 스케쥴을 조사해서 사람들이 버스에 탈 수 있는지 없는지 체크하고 마지막으로 탄 사람의 시간을 기록해놓는다. 

 

count

cnt는 마지막 버스에 사람이 얼마나 탔는지 나타내준다. 따라서 m(버스에 탈 수 있는 사람)보다 작으면 마지막 버스에 탈 수 있는다는 것이므로 버스가 마지막으로 출발한 시간이 정답이다(t를 빼준 건 마지막 출발 시간에 t가 한번더 더해지므로)

 

하지만 cnt>=m 이라면, 마지막 버스에 자리가 없다는 뜻이므로, 마지막으로 탄 사람보다 1분 먼저 와야한다.

따라서 lastTime-1이 정답이다.

time2str

이후 정수를 다시 "HH:MM" 형식에 맞춰 변환해준뒤 반환해주는 함수를 작성해 이용하면 끝이다.

코드

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
import java.util.*;
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<timetable.length; i++){
            list.add(str2time(timetable[i]));
        }
        Collections.sort(list); // 오름차순 정렬
        
        int busStartTime = 540// 9*60=540, 첫 버스 출발 시간
        int lastTime = 0;   // 마지막으로 탄 사람 시간
        int idx = 0;
        int cnt = 0;
        
        for(int i=0; i<n; i++){
            cnt = 0;
            if(idx >= list.size()) break;
            while(cnt < m){
                if(busStartTime >= list.get(idx)){
                    lastTime = list.get(idx);   // 마지막으로 탄 사람 갱신
                    idx++;
                    cnt++;
                    if(idx >= list.size()) break;
                }else{
                    break;
                }
            }
            busStartTime += t;   
        }
        
        if(cnt < m){    // 마지막 버스에 자리가 있음
           answer = time2str(busStartTime-t);
        }else { // 마지막 버스에 자리가 없음 -> 마지막으로 탄사람보다 1분 먼저 와야 함
            answer = time2str(lastTime-1);
        }
        
        return answer;
    }
    
    /* String -> time */
    public static int str2time(String str){
        String[] tmp = str.split(":");
        int hour = Integer.parseInt(tmp[0]) * 60;
        int min = Integer.parseInt(tmp[1]);
        return hour+min;
    }
    
    /* time -> String */
    public static String time2str(int time){
        String ret = "";
        String hour = String.valueOf(time/60);
        String min = String.valueOf(time%60);
        if(hour.length()<2){
            ret += "0";
        }
        ret += hour+":";
        if(min.length()<2){
            ret += "0";
        }
        ret += min;
        
        return ret;
    }
}
cs

결과

result

반응형

댓글

Designed by JB FACTORY