programmers_호텔 대실_java

2023. 5. 12. 13:19Algorithm/Programmers

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/155651

 

프로그래머스

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

programmers.co.kr

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

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;

        // 입장 시간 순으로 정렬
        Arrays.sort(book_time, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                String[] o1Time = o1[0].split(":");
                String[] o2Time = o2[0].split(":");
                // res = 양수 : 오름차순
                int res = (Integer.parseInt(o1Time[0]) * 60) - (Integer.parseInt(o2Time[0]) * 60)
                        + (Integer.parseInt(o1Time[1]) - Integer.parseInt(o2Time[1]));

                return res;
            }
        });

        answer = countRoom(book_time);

        return answer;
    }

    // 필요 최소 객실 수 구하기
    public int countRoom(String[][] book_time){
        int cnt = 0;

        // 퇴실 시간 순 우선순위큐
        PriorityQueue<String[]> pq = new PriorityQueue<>(new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                String[] o1Time = o1[1].split(":");
                String[] o2Time = o2[1].split(":");
                // res = 양수 : 오름차순
                int res = (Integer.parseInt(o1Time[0]) * 60) - (Integer.parseInt(o2Time[0]) * 60)
                        + (Integer.parseInt(o1Time[1]) - Integer.parseInt(o2Time[1]));
                return res;
            }
        });

        // 입실시간 순으로 정렬된 book_time 순회
        for (String[] book : book_time){
            if (pq.isEmpty()){
                cnt++;
            }
            else if(timeCompare(pq.peek(), book) <= 0){ // 기존 방 입실 가능
                pq.poll();
            }else { // 기존 방 입실 불가능
                cnt++;
            }
            pq.offer(book); // 방 입실
        }

        return cnt;
    }

    // 기존 방 입장 가능 여부 판단 함수
    public int timeCompare(String[] t1, String[] t2){
        String[] t1Time = t1[1].split(":"); // 기존 퇴실 시간
        String[] t2Time = t2[0].split(":"); // 신규 입실 시간
        // res = 양수 : 오름차순
        int res = (Integer.parseInt(t1Time[0]) * 60) - (Integer.parseInt(t2Time[0]) * 60)
                + (Integer.parseInt(t1Time[1]) + 10 - Integer.parseInt(t2Time[1]));

        return res;
    }
}