728x90
https://programmers.co.kr/learn/courses/30/lessons/17678
코딩테스트 연습 - [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
- 문제

문제 1 
출력 예시
풀이
- 개인적으로 상당히 까다로웠던 문제이다.
- 시간과 분을 저장한 Time클래스를 담는 우선순위 큐에 모든 데이터를 저장한다.
- 시간이 다르면 시간이 작은 순으로, 시간이 같다분 분이 작은 순으로 우선순위를 높게 부여한다.
- Time 클래스의 생성자에 비지니스 로직
- 분(Mitune)이 0 보다 작을 경우 시간-1, 분 + 60
- 분(Mitune)이 60보다 클경우 시간 + 1, 분 - 60
- counting 메서드
- 여기서의 핵심 로직은 마지막 탈 수 있는 버스까지 왔을 때, 버스가 꽉 차 있을 경우랑 꽉 차 있지 않을 경우로 나누는 것이다.
- 만약 버스가 꽉 차 있을경우 Corn이 타기 위해서는 마지막으로 버스에 탑승한 사람을 도착시간 -1분을 해주면 된다.
- 만약 버스가 꽉 차 있지 않을 경우 버스에 자리가 있으므로 버스 도착시간에만 오면 된다.
- i for문 = 버스 도착 시간을 돈다.
- j for문 = 버스에 최대 탈 수 있는 인원까지 돈다.
- 여기서의 핵심 로직은 마지막 탈 수 있는 버스까지 왔을 때, 버스가 꽉 차 있을 경우랑 꽉 차 있지 않을 경우로 나누는 것이다.
-
class Time implements Comparable<Time>{ int hour; int mitune; public Time(int hour,int mitune) { if(mitune >= 60) {//분이 60보다 크면 시간을 더해주고 분을 60 빼준다 hour++; mitune -= 60; }else if(mitune < 0) {//분이 0보다 작으면 시간을 빼주고 분을 60 더해준다. hour--; mitune += 60; } this.hour = hour; this.mitune = mitune; } @Override public int compareTo(Time o) { // 우선순위부여 기준 if(o.hour == this.hour)//시간이 같다면 return this.mitune - o.mitune; // 분이 작은 순으로 return this.hour - o.hour;//시간이 작은 순으로 } } public static String answer; public static String solution(int n, int t, int m, String[] timetable) { answer = "";//정답 Queue<Time> pq = new PriorityQueue<>(); for(int i=0;i<timetable.length;++i) { int hour = Integer.parseInt(timetable[i].split(":")[0]); int mitune = Integer.parseInt(timetable[i].split(":")[1]); pq.offer(new Time(hour,mitune));//내가 시간이 작은 순으로 정렬된다. } counting(n,t,m,pq); return answer; } private static void counting(int n, int t, int m, Queue<Time> pq) { Time bus = new Time(9, 0); Time corn = new Time(9, 0); for(int i=0;i<n;++i) {//마지막 버스까지 int people = 0; for(int j=0;j<m;++j) {//해당 버스의 마지막 사람까지 if(!pq.isEmpty()) { Time now = pq.peek(); if(bus.compareTo(now) >= 0) { // 기다리는 사람이 해당 버스를 탈 수 있다면 corn = pq.poll(); //해당 버스를 태운다. people++; //태운 사람 숫자 증가 } } if(i == n-1 && people == m) { //마지막 버스의 태운 사람이 꽉찰경우 corn = new Time(corn.hour, corn.mitune-1); // 콘이 탈 자리가 없으므로 마지막으로 태운 사람의 도착시간을 -1분을 한다. }else if(i == n-1 && people < m) {//마지막 버스의 자리가 남을 경우 corn = new Time(bus.hour,bus.mitune); // 콘이 탈 자리가 있으므로 버스 도착 시간에 오면 된다. } } bus = new Time(bus.hour, bus.mitune+t); // 다음 버스 시간 세팅 } StringBuilder sb = new StringBuilder(); sb.append((corn.hour < 10) ? "0"+corn.hour : corn.hour); // 한자리 숫자면 앞에 0을 붙힌다 sb.append(":"); sb.append((corn.mitune < 10) ? "0"+corn.mitune : corn.mitune);//한자리 숫자면 앞에 0을 붙힌다 answer = sb.toString(); }
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| LEVEL 3 : 보석쇼핑 (0) | 2021.12.08 |
|---|---|
| LEVEL 3 : 표 편집 (0) | 2021.12.08 |
| LEVEL 3 : 자물쇠와 열쇠 (0) | 2021.11.26 |
| LEVEL 3 : 다단계 칫솔 판매 (0) | 2021.11.26 |
| LEVEL 3 : 순위 (0) | 2021.11.26 |