출처: https://school.programmers.co.kr/learn/courses/30/lessons/155651
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❔ 문제
문제 설명
호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 1 ≤ book_time의 길이 ≤ 1,000
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
- [대실 시작 시각, 대실 종료 시각] 형태입니다.
- 시각은 HH:MM 형태로 24시간 표기법을 따르며, "00:00" 부터 "23:59" 까지로 주어집니다.
- 예약 시각이 자정을 넘어가는 경우는 없습니다.
- 시작 시각은 항상 종료 시각보다 빠릅니다.
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
입출력 예

🔍 풀이
접근 방식
방에 입실할 수 있는 기준이 이전에 입실해 있는 사람의 퇴실 시간보다 현재 입실 시간이 더 뒤여야 가능하다라는 것에서 입실 시간을 기준으로 정렬해서 입실 시간과 퇴실 시간을 비교해서 풀어야 한다고 생각했습니다.
풀이
입실 시간과 퇴실 시간이 담긴 배열을 입실 시간을 기준으로 정렬해야 합니다.
입퇴실 시간을 비교하기 쉽도록 숫자로 바꾸고 분으로 모두 변환해서 2차원 배열 booking에 저장했습니다. 퇴실 시간을 저장할 때는 청소 시간이 10분 포함되도록 했습니다.
그리고 객실을 의미하는 arraylist rooms를 하나 만들어서 값으로는 그 방에 입실한 사람의 입퇴실시간을 저장합니다.
입퇴실 시간 배열인 booking을 돌면서 현재 입실하려고 하는 사람의 입실 시간이 이미 입실한 사람들의 퇴실 시간보다 크다면 그 객실에 입실 시키고, 입실 시간보다 작은 퇴실 시간이 없다면 객실을 하나 추가해줍니다.
booking을 다 돌고난 뒤의 rooms의 길이가 필요한 최소 객실의 수가 됩니다.
💡 소스코드
import java.util.*;
class Solution {
ArrayList<int[]> rooms = new ArrayList<>();
public int solution(String[][] book_time) {
int[][] booking = new int[book_time.length][2];
for(int i=0; i<book_time.length; i++){
booking[i][0] = changetoMin(book_time[i][0]);
booking[i][1] = changetoMin(book_time[i][1]) + 10;
}
// 입실 시간을 기준으로 오름차순 정렬
Arrays.sort(booking, (o1, o2) -> o1[0] - o2[0]);
// 최소 하나는 입실해야 하기 때문에 첫번째 손님 입실
rooms.add(booking[0]);
for(int i=1; i<booking.length; i++){
int checkin = booking[i][0]; // 다음 손님의 입실시간
// 현재 입실해있는 사람들의 퇴실시간과 비교해서 그 방에 입실 가능하다면 대체하기
for(int j=0; j<rooms.size(); j++){
if(checkin >= rooms.get(j)[1]){
rooms.remove(j);
break;
}
}
rooms.add(booking[i]);
}
return rooms.size();
}
// HH:MM을 분으로 변환하기
int changetoMin(String time){
return Integer.parseInt(time.split(":")[0]) * 60 + Integer.parseInt(time.split(":")[1]);
}
}
'Programming > Programmers' 카테고리의 다른 글
[프로그래머스] Lv2. 멀쩡한 사각형(Java) (0) | 2023.07.27 |
---|---|
[프로그래머스] Lv2. 숫자 카드 나누기(Java) (0) | 2023.07.27 |
[프로그래머스] Lv2. 점 찍기 (Java) (0) | 2023.07.22 |
[프로그래머스] Lv2. 방금그곡 (Java) (0) | 2023.07.14 |
[프로그래머스] Lv2. 무인도 여행 (Java) (0) | 2023.07.14 |