호텔대실

Lee1231234·2023년 3월 29일

코딩테스트

목록 보기
6/95

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

  1. 문자열을 숫자로 변형
  2. 입실시간을 기준으로 배열정렬
  3. 배열 순회, 만약 이번 입실시간이 저장되어있는 퇴실시간보다 늦다면(15:00<16:00)
    큐에서 제외시킴.
  4. 가장 객실이 많을때를 기준으로 리턴.

코드- 우선순위큐

import java.util.*;
class Solution {
    public int solution(String[][] book_time) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
        int[][] time = new int[book_time.length][2];
        int answer = 0;
        
        for(int i=0;i<book_time.length;i++){
            time[i][0]=intTime(book_time[i][0]);
            time[i][1]=intTime(book_time[i][1])+10;
        }
        
        Arrays.sort(time,(o1,o2)->{return o1[0]-o2[0];});
             
        for(int i=0;i<book_time.length;i++){
            while(!priorityQueue.isEmpty()&&priorityQueue.peek()<=time[i][0]){
                priorityQueue.poll();
            }
            priorityQueue.add(time[i][1]);
            answer = Math.max(answer,priorityQueue.size());
            
        }
        
        return answer;
    }
    int intTime(String times){
        String[] time = times.split(":");
        return Integer.parseInt(time[0])*60+Integer.parseInt(time[1]);
    }
}
  1. 문자열을 숫자로 변형
  2. 모든시간대를 배열로 지정
  3. 입실할때 사이즈를 1늘리고 퇴실시 사이즈를 1 줄임
  4. 모든 배열을 순회하며 누적합, 가장 객실이 많을때를 기준으로 리턴.
    코드-누적합
import java.util.*;
class Solution {
    public int solution(String[][] book_time) {
        int timeMax=60*24+10;
        int[] line = new int[timeMax];
 
        int answer = 0;       
        for(int i=0;i<book_time.length;i++){        
            line[intTime(book_time[i][0])]+=1;
            line[intTime(book_time[i][1])+10]+=-1;
        }
          for(int i=1;i<timeMax;i++){
              line[i]+=line[i-1];
              answer= Math.max(answer,line[i]);
         }
                           
        return answer;
    }
    int intTime(String times){
        String[] time = times.split(":");
        int tmp =Integer.parseInt(time[0])*60+Integer.parseInt(time[1]);
        return tmp;
    }
}
profile
not null

0개의 댓글