반응형
문제
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" 까지로 주어집니다.
- 예약 시각이 자정을 넘어가는 경우는 없습니다.
- 시작 시각은 항상 종료 시각보다 빠릅니다.
- book_time[i]는 ["HH:MM", "HH:MM"]의 형태로 이루어진 배열입니다
- 호텔에 최소한의 객실만을 사용하여 예약 손님을 받으려고 한다.
- 한 번 사용한 객실은 퇴실 시간을 기준으로 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();
}
}
반응형
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 점 찍기 (0) | 2024.04.04 |
---|---|
[프로그래머스] 테이블 해시 함수 (0) | 2024.04.03 |
[프로그래머스] 멀쩡한 사각형 (0) | 2024.03.29 |
[프로그래머스] [3차] 방금그곡 (0) | 2024.03.29 |
[프로그래머스] 하노이의 탑 (0) | 2024.03.28 |