https://school.programmers.co.kr/learn/courses/30/lessons/155651
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다.
한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시간이 문자열 형태로 담긴 2차원 배열 book_time이 매개 변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution함수를 완성해 주세요.

💡 아이디어
손님의 대실 시작시간이 현재 있는 객실 중에 이용 가능한 객실이 있으면 해당 객실에 배정하고, 만약 객실이 다 사용 중이라면 새로운 객실을 추가해 손님을 배정하도록 합니다.
📗 풀이 과정
예시 : [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]
1. 일단 대실 시작 시간이 빠른 순으로 book_time을 정렬해 줍니다. (객실을 먼저 온 사람에게 먼저 배정해야 하기 때문.)
[["14:10", "19:20"], ["14:20", "15:20"], ["15:00", "17:00"], ["16:40", "18:20"], ["18:20", "21:20"]]
2. 정렬된 book_time에서 손님 예약 정보를 하나씩 받아옵니다.
3. 해당 손님을 배정할 수 있는 객실을 찾습니다.
객실이 저장되어 있는 ArrayList는 객실별 이용가능 시작시간을 넣어놓습니다.

4. 이용 가능한 객실이 없기 때문에, 새로운 객실을 생성하고 해당 손님을 예약해 손님의 퇴실시간+청소(10분)가 끝나는 시각을 분(minutes) 형식으로 바꿔 객실 list에 저장해 줍니다.

5. 만약 이용가능한 객실이 있다면 해당 객실 또한 4번처럼 현재 예약하려는 손님의 퇴실시간+10분의 시각으로 바꿔놓습니다.
6. 위의 작업을 book_time에 있는 예약한 손님들이 모두 예약을 마칠 때까지 반복했을 때, 만들어지는 객실 수가 최소한의 객실 수입니다.

전체 코드
import java.util.*;
class Solution {
ArrayList<Integer> availTime = new ArrayList<>();//객실별 이용가능 시작시간
public int solution(String[][] book_time) {
int answer = 0;
//예약시간이 빠른 순으로 book_time 정렬
Arrays.sort(book_time, (s1,s2)->changeMins(s1[0])-changeMins(s2[0]));
for(int i=0;i<book_time.length;i++){//예약 손님 받기
//사용가능한 객실 번호 찾기
int roomNum=-1;
for(int j=0;j<availTime.size();j++){
//손님 대실 시작 시간 >= j번째 객실 이용 가능한 시작 시간
if(changeMins(book_time[i][0])>=availTime.get(j)){ roomNum=j;break; }
}
//이용가능한 객실이 있으면, 이용이 끝나는시간+10분 청소가 끝나는 시간 넣어줍니다.
if(roomNum>=0) availTime.set(roomNum,changeMins(book_time[i][1])+10);
//이용할 수 있는 객실이 없다면 하나 추가하고 손님 받아서 넣음.
else availTime.add(changeMins(book_time[i][1])+10);
}
for(int i:availTime) System.out.print(i+" ");
return availTime.size();
}
// (String)시간 -> (int) 분
int changeMins(String time){
String[] t = time.split(":");
return Integer.parseInt(t[0])*60+Integer.parseInt(t[1]);
}
}'Algorithms(CT) > Programmers' 카테고리의 다른 글
| [프로그래머스] Lv.2 거리두기 확인하기 (Java) (0) | 2023.07.26 |
|---|---|
| [프로그래머스] Lv.2 점 찍기 (Java) (0) | 2023.07.21 |
| [프로그래머스]Lv.2 배달 (Java) (0) | 2023.07.20 |
| [프로그래머스] Lv.2 행렬 테두리 회전하기 (Java) (0) | 2023.07.19 |
| [프로그래머스] Lv.2 수식 최대화 (Java) (0) | 2023.07.18 |