프로그래머스 | 호텔 대실 (Java)

mul·2023년 9월 26일
0

코딩테스트연습

목록 보기
54/56

🔒문제

프로그래머스 Lv2. 연습문제 호텔 대실

🔑해결

예약 시간이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 필요한 최소 객실의 수를 return하는 solution 함수를 작성하는 문제이다.

  1. 문자열 배열 형태의 book_time를 정수형 배열로 변환
  2. 변환된 정수 배열을 입실 시각과 퇴실 시각이 빠른 것을 기준으로 정렬
  3. PriorityQueue를 사용하여 가상의 호텔처럼 사용
    3-1. PriorityQueue의 peek은 가장 빠른 퇴실 시각으로 새로 입실할 시각이 퇴실 시각보다 빠르면 객실을 추가(PriorityQueue에 퇴실시각 add)
    3-2. 입실 시각이 가장 빠른 퇴실 시각보다 느리면, 퇴실 시각을 poll하고 새로 입실할 고객의 퇴실 시각을 add
    3-3. 각 객실의 가장 마지막 고객은 PriorityQueue에 남게 되므로 PriorityQueue의 size가 필요한 객실의 수가 된다. 그러므로 이를 answer에 저장 후 return

🔓코드

import java.util.Arrays;
import java.util.PriorityQueue;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        
        int[][] ibt = time_string_to_int(book_time);
        
        // 입실 시각과 퇴실 시각이 빠른 것을 기준으로 정렬
        Arrays.sort(ibt, (o1, o2) -> {
        	if (o1[0] > o2[0]) {
        		return 1;
        	} else if (o1[0] < o2[0]) {
        		return -1;
        	} else {
        		if (o1[1] > o2[1]) {
        			return 1;
        		} else {
        			return -1;
        		}
        	}
        });
        
        // 방 배정
        PriorityQueue<Integer> room = new PriorityQueue<>();
        for (int[] time : ibt) {
			if (room.size() > 0) {
				if (time[0] >= room.peek()) {
					room.poll();
					room.add(time[1]);
				} else {
					room.add(time[1]);
				}
			} else {
				room.add(time[1]);
			}
		}
        
        answer = room.size();
        
        return answer;
    }
	
	private int[][] time_string_to_int(String[][] book_time) {
    	int[][] ibt = new int[book_time.length][2];
    	
    	for (int i = 0; i < book_time.length; i++) {
			ibt[i][0] = Integer.parseInt(book_time[i][0].replaceAll(":", "")); // 입실 시각
			ibt[i][1] = 10 + Integer.parseInt(book_time[i][1].replaceAll(":", "")); // 퇴실 시각
			
			if (ibt[i][1] % 100 >= 60) { // 퇴실 시각 m이 60분을 넘을 경우를 가정
				ibt[i][1] = ibt[i][1] + 100 - 60;
			}
		}
    	
    	return ibt;
    }
}

0개의 댓글