코테/프로그래머스

[프로그래머스/Level3] [1차] 셔틀버스 (JAVA)

imname1am 2024. 7. 27. 19:03
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

💡  풀이 방식

• 우선순위 큐

필요 자료구조
- 도착 시간을 "분"으로 변환한 값을 저장한 우선순위 큐
- 현재 시간, 마지막 시간, 셔틀버스 탑승 인원 시간 저장용 변수

 

 

1. 크루들의 도착 시간을 "분"으로 변환해 우선순위 큐에 저장한다.

2. 현재 시간, 마지막 시간, 셔틀버스 탑승 인원 저장용 변수를 사용한다.

  - 현재 시간 : 오전 9시로 시작하고, 셔틀버스가 지나갈 때마다 t시간만큼 더한다.

3. 우선순위 큐에서 크루들의 도착 정보를 하나씩 확인하며 계산한다.

  - 가장 빨리 도착한 크루부터 확인한다.

  - 버스 시간보다 이전에 도착했고, 마지막에 셔틀 버스에 탄 인원이 m보다 작다면, 셔틀 버스에 탈 수 있다.

  - 현재 셔틀버스에 크루가 탈 때마다 마지막 시간을 현재 크루의 시간 -1로 재설정한다. (해당 크루보다 1분 먼저 도착하는 게 가장 마지막으로 도착해 해당 버스에 탈 수 있는 시간이므로)

 

 

4. 마지막 버스에 자리가 남는 경우, 해당 버스 도착 시간에 맞춰 나가면 된다.

  - 문제 조건에 9시에 도착한 셔틀은 자리가 있다면 9시에 도착한 크루를 태울 수 있다고 했기 때문

5. 얻은 마지막 시간 정보를 "시간:분"의 형태로 변환해 출력한다.

 

 

🔺 코드

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
import java.util.*;
 
class Solution {
    public String solution(int n, int t, int m, String[] timetable) {
        String answer = "";
        
        // 도착 시간을 "분"으로 변환해 우선순위 큐에 담기
        PriorityQueue<Integer> pq = new PriorityQueue<>();        
        for(String tt : timetable) {
            int time = Integer.parseInt(tt.substring(02)) * 60 + Integer.parseInt(tt.substring(3));
            pq.add(time);
        }
        
        int start = 9*60;   // 현재 시간 (9시로 시작)
        int last = 0;       // 마지막 시간
        int total = 0;      // 셔틀버스 탑승 인원
        
        for(int i = 0 ; i < n ; i++) {
            total = 0;
            
            while(!pq.isEmpty()) {
                int now = pq.peek();
                
                // 버스 시간보다 이전에 도착했고,
                // 마지막에 셔틀 버스에 탄 인원이 m보다 작다면, 셔틀 버스에 탈 수 있음
                if(now <= start && total < m) {
                    pq.poll();
                    total++;
                }
                else {
                    break;
                }
                
                // 마지막 시간을 현재 크루의 시간 -1로 재설정
                last = now - 1;
            }
            
            start += t; // 셔틀버스가 지나갔으니 시간 더하기
        }
        
        // 마지막 셔틀 버스에 탄 인원이 m보다 작다면, 해당 셔틀 버스에 콘이 탈 수 있음
        if(total < m) {
            last = start - t;
        }
        
        // 시간 정보 시간:분 형태로 출력하기
        String hh = String.format("%02d", last/60);
        String mm = String.format("%02d", last%60);
        
        return hh + ":" + mm;
    }
}
cs

 

 

➕ 다른 풀이 방식

- 리스트 배열/리스트를 활용한 풀이 (List<List<Integer>>, List<Integer>[])

 

[pro] 프로그래머스 level3 17678 셔틀버스 (Java) - 우선순위 큐

[문제] https://school.programmers.co.kr/learn/courses/30/lessons/17678 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이

stritegdc.tistory.com

 

[프로그래머스]2018카카오블라인드:[1차] 셔틀버스(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 이문제는 당시에 난이도 상에 포함

technote-mezza.tistory.com

 

 


💦 어려웠던 점

-  문제 자체를 이해하는 것이 어려웠다.

- 우선순위 큐 사용할 생각을 해야 했다는 것

 

 

🧐 새로 알게 된 내용

- String.format() 메서드 사용법 : String hh = String.format("%02d", last/60); ⇒ 한 자리 숫자인 시간을 두 자리로 만들 때 사용

 

 

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

(참고)

 

[프로그래머스]셔틀버스 - 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

moonsbeen.tistory.com

 

 

프로그래머스 셔틀버스 문제 (자바)

크루들을 우선순위 큐에 전부 집어놓고 버스 도착 시간마다 큐에서 버스에 탑승 가능한 인원만큼 빼고는 방법으로 계산하면 된다. 중요한점은 세가지 정도로 1 . 문자열의 시간을 숫자로 변경해

wellbell.tistory.com

 

반응형