본문 바로가기
Algorithm/프로그래머스

[프로그래머스] 호텔 대실

by LeeGangEun 2023. 7. 4.

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

자바에서는 PriorityQueue(우선순위 큐)를 이용해서 쉽게 풀 수 있다. 천천히 살펴보자

1. book_time 값을 int 형태로 변환
   -> 10분간 청소한다  라는 조건이 없으면 string으로 사용해도 되지만 10분간 청소한다는 조건이 있어
       int형으로 변환 후 시간을 추가해 주어야 한다.

2. int[][] 배열을 입장시간 기준으로 정렬
  -> Compartor.comparing 메서드를 사용하면 쉽게 정렬할 수 있다.

3. 배열을 순회하며 방을 늘려준다.
  -> queue에 넣어주는값은 고객들의 퇴실시간이다.
   -> 고객이 입장할 때 우선순위큐를 순회하여 퇴실시간이 입장시간보다 빠르면 큐에서 제거해준다.

위와 같은 로직으로 쉽게 풀 수 있는 문제였다.

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

class Solution {
    public int solution(String[][] book_time) {
        int[][] convertOfBookTime = convert(book_time);

        Arrays.sort(convertOfBookTime, Comparator.comparing(arr -> arr[0]));
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int count = 1;

        for (int[] arr : convertOfBookTime) {
            while (!pq.isEmpty() && pq.peek() <= arr[0]) pq.poll();
            if (pq.size() >= count) count++;
            pq.add(arr[1]);
        }

        return count;
    }

    private int[][] convert(String[][] bookTime) {

        int[][] arr = new int[bookTime.length][2];

        for (int i = 0; i < bookTime.length; i++) {
            String startTime = bookTime[i][0];
            String endTime = bookTime[i][1];

            String startHour = startTime.substring(0, 2);
            String startMinute = startTime.substring(3, 5);
            String endHour = endTime.substring(0, 2);
            String endMinute = endTime.substring(3, 5);

            arr[i][0] = (Integer.parseInt(startHour) * 60)  +  Integer.parseInt(startMinute);
            arr[i][1] = (Integer.parseInt(endHour) * 60)  + Integer.parseInt(endMinute) +  10;
        }

        return arr;
    }
}