https://school.programmers.co.kr/learn/courses/30/lessons/155651?language=java
손님이 예약한 방 시간대를 취합해서 가장 최소한의 방으로 손님을 모두 맞이할 수 있도록 계산하는 문제.
예약 시작시간으로 오름차순 정렬 후, 같은 시간대에서는 종료시간으로 오름차순 하여 첫번째 예약을 제외하고,
두번째 예약부터 비어있는 방이 있는지 탐색 후에 비어있지 않다면 +1, 비어있다면 그 방을 사용하도록 하면 된다. ( 청소시간 포함 )
문자열로 들어온 book_time 을 정수형으로 바꾸거나 문자열 그대로 할 수 있지만 청소시간으로 인해 시간이 넘어갈 때 계산이 귀찮아서 그냥 Date 로 전환해서 했다.
가장 빨리 비어있는 방 탐색을 위해 우선순위 큐를 사용함
전체 풀이 >>
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
class Solution {
public int solution(String[][] book_time) {
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Arrays.sort(book_time, Comparator.comparing((String[] s) -> s[0]).thenComparing(s -> s[1]));
PriorityQueue<Date> queue = new PriorityQueue<>();
try {
Date date = new Date(format.parse(book_time[0][1]).getTime());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MINUTE, 10);
queue.add(calendar.getTime());
for(int i = 1; i<book_time.length; i++) {
Date endTime = queue.peek();
Date start = new Date(format.parse(book_time[i][0]).getTime());
Date end = new Date(format.parse(book_time[i][1]).getTime());
Calendar endCalc = Calendar.getInstance();
endCalc.setTime(end);
endCalc.add(Calendar.MINUTE, 10);
if (endTime.compareTo(start) <= 0) {
queue.poll();
}
queue.add(endCalc.getTime());
}
} catch (ParseException e) {
e.printStackTrace();
}
return queue.size();
}
}
위에는 가장 쉽게 생각할 수 있는 풀이 방법이고,
다른 방법이 없나 찾아봤더니 누적합 으로도 풀이가 가능하다더라 .. 🙄
코드가 훨씬 간결해지니 다시 풀어보는 것도 좋을 듯 하다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 연속 펄스 부분 수열의 합 (자바) (0) | 2023.04.12 |
---|---|
[프로그래머스] 무인도 여행 (Java) (0) | 2023.03.23 |
[프로그래머스] 덧칠하기 - Java (0) | 2023.03.17 |
[프로그래머스] 귤 고르기 (0) | 2023.01.03 |
[프로그래머스] 디펜스 게임 (0) | 2023.01.03 |