본문 바로가기

코딩 테스트/프로그래머스

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

반응형

문제

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

 

프로그래머스

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

programmers.co.kr

 

문제 분석

[제한사항]

  • 1 ≤ book_time의 길이 ≤ 1,000
    • book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
      • [대실 시작 시각, 대실 종료 시각] 형태입니다.
    • 시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
      • 예약 시각이 자정을 넘어가는 경우는 없습니다.
      • 시작 시각은 항상 종료 시각보다 빠릅니다.

 

  • 호텔에 최소한의 객실만을 사용하여 예약 손님을 받으려고 한다.
  • 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님을 받을 수 있다.
  • 매개변수로는 예약 시간이 문자열 형태로 담긴 2차원 배열 book_time 이 주어진다.
  • 필요한 최소 객실의 수를 구해라

 

문제 접근

우선 손님이 올 때 마다 이미 사용했던 방 중에 줄 수 있다면 그 방을 주고, 그렇지 않다면 새로운 방을 주어야 할 것이다.

그래서 해당 배열을 입실 순서가 빠른 손님 순으로 정렬을 해야 한다.

 

그렇게 입실 순서대로 손님이 올 때마다 현재 방 중에서 들어갈 수 있는 방이 있는 지 확인하고 있다면 그 방에 들어가고 

  • 해당 방에 마지막으로 들어간 손님의 퇴실 시간 + 10 보다 현재 들어올 손님의 입실 시간이 더 늦어야 한다. 

이미 있는 방을 모두 돌아도 없다면 새로운 방을 만들어 들여보낸다.

 

코드

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        List<int[]> times = new ArrayList<>();
        
        for(String[] time : book_time){
            String[] startArr = time[0].split(":");
            int start = Integer.parseInt(startArr[0]) * 60 + Integer.parseInt(startArr[1]);
            
            String[] endArr = time[1].split(":");
            int end = Integer.parseInt(endArr[0]) * 60 + Integer.parseInt(endArr[1]);
            
            times.add(new int[]{start, end});
        }
        
        Collections.sort(times, (o1, o2) -> o1[0] - o2[0]);
        
        List<Integer> lastTimes = new ArrayList<>();
        
        for(int[] time : times){
            boolean flag = true;
            for(int i=0; i<lastTimes.size(); i++){
                int lastTime = lastTimes.get(i);
                if(lastTime + 10 <= time[0]){
                    lastTimes.set(i, time[1]);
                    flag = false;
                    break;
                }
            }
            if(flag){
                lastTimes.add(time[1]);
            }
        }
    
        return lastTimes.size();
    }
}
반응형