본문으로 바로가기

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

손님이 예약한 방 시간대를 취합해서 가장 최소한의 방으로 손님을 모두 맞이할 수 있도록 계산하는 문제. 

 

예약 시작시간으로 오름차순 정렬 후, 같은 시간대에서는 종료시간으로 오름차순 하여 첫번째 예약을 제외하고, 

두번째 예약부터 비어있는 방이 있는지 탐색 후에 비어있지 않다면 +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();
    }
}

 

 

위에는 가장 쉽게 생각할 수 있는 풀이 방법이고, 

다른 방법이 없나 찾아봤더니 누적합 으로도 풀이가 가능하다더라 .. 🙄

 

코드가 훨씬 간결해지니 다시 풀어보는 것도 좋을 듯 하다.