알고리즘

프로그래머스 Lv.2 호텔 대실 - JAVA

jaewoo 2023. 3. 20. 13:51

문제

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return하는 함수를 작성

 

 

풀이

여기서 가장 어려운게 입력이었던 것 같다... 입력형태가 HH:MM 형태로 들어오는데 해당 형태를 기존에는 substring으로 긁어서 가져오는 형식으로 했는데 마지막에 테스트17번에서 계속 실패했다. 이유는 10분을 추가했을 경우 1시간을 올리는 문제였는데 그걸 몰라 결국 마지막에 다른사람의 풀이를 보고 알게 되었다. 

그래서 입력형식도 substring이 아닌 replaceAll로 변경했고 시간 올림은 19:50 으로 들어올 경우 10분 추가혀면 20:00이 되어야한다. 일단 replaceAll(":","") 을 통해 해당 값을 int타입으로 변경한다. 1950이 들어오는데 해당 값에 10을 추가하여 1960이 나온다. 해당 값을 100으로 나누면 나머지가 60이다 나머지가 60보다 클 경우 플러스 40을 해주면 2000이다.

이렇게 입력을 받고 우선순위 큐를 사용하면 간단하게 풀 수 있다.

peek()가 다음 시작시간보다 클 경우 그냥 add 만약 peek가 더 작을 경우 같은 방을 사용할 수 있으므로 poll후 add

 

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        int time[][] = new int[book_time.length][2];
        
        for(int i =0;i<book_time.length;i++){
            int startTime = Integer.parseInt(book_time[i][0].replace(":",""));
            int endTime = Integer.parseInt(book_time[i][1].replace(":",""));
            
            endTime += 10;
            if(endTime%100 >= 60){
                endTime+=40;
            }
            time[i][0] = startTime;
            time[i][1] = endTime;
        }
        
        Arrays.sort(time, new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2){
                return o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0];
            }
        });
            
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        

        for(int[] timeTemp : time){
            if(queue.size() == 0){
                queue.add(timeTemp[1]);
                continue;
            }
            if((queue.peek()) <= timeTemp[0]){
                queue.poll();
                queue.add(timeTemp[1]);
            }else{
            
                queue.add(timeTemp[1]);
            }
        }
        
        return queue.size();
    }
}

 

 

참고

https://123okk2.tistory.com/427

 

[JAVA] 호텔 대실

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

123okk2.tistory.com