문제 설명
호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 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 | result |
[["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]] | 3 |
[["09:10", "10:10"], ["10:20", "12:20"]] | 1 |
[["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]] | 3 |
내가 푼 풀이
어디선가 많이 본 익숙한 문제다.
1. 시작시간을 기준으로 오름차순 정렬한다.
2. 시작시간이 가장 빠른 예약부터 방에 넣는다.
3. 시작시간이 동일한경우, 종료시간이 빠른 예약부터 넣는다.
4. 방 중에 종료시간+10분과 다음예약이 같거나 크다면 해당방에 다음예약을 넣는다.
주의: 종료시간뒤 10분의 청소시간이 주어지므로 종료시간 + 10분 해야하지만, 50...59분 종료시간엔 시 단위가 바뀐다.
코드로 구현하면 다음과 같다.
import Foundation
func solution(_ book_time:[[String]]) -> Int {
var reservation = [[Int]]()
var rooms = [[Int]]()
var answer = 0
var index = 0
// 시작시간과 종료시간을 숫자로 변환
for i in 0..<book_time.count {
var res = book_time[i]
var start = res[0].split(separator: ":").joined(separator: "")
var end = res[1].split(separator: ":").joined(separator: "")
reservation.append([Int(start)!, Int(end)!])
}
// 예약배열을 시작시간 기준 오름차순으로 정렬
// 시작시간이 같다면 종료시간이 빠른 순으로 정렬
var sorted = reservation.sorted{
if $0[0] == $1[0] {
return $0[1] < $1[1]
} else {
return $0[0] < $1[0]
}}
// index: 정렬된 예약배열 인덱스
// answer: 정답출력 변수
while index < sorted.count {
// 이용중인 방이 없다면 바로 넣는다.
if rooms.isEmpty {
rooms.append(sorted[index])
index += 1
answer += 1
continue
}
// 다음예약자의 시작시간과 종료시간
var resStart = sorted[index][0]
var resEnd = sorted[index][1]
var find = false
// 이용중인 방이 있다면 종료시간들을 검사한다.
for i in 0..<rooms.count {
var end = rooms[i][1]
end += 10
var str = String(end)
// 종료후 청소시간이 60~69 사이라면 시단위가 올라가야한다.
if Int(str.suffix(2))! >= 60 {
end += 100
end -= 60
}
// 종료시간과 다음예약의 시작시간이 동일하거나 작다면 이 방으로 다음예약을 넣는다.
if end <= resStart {
rooms[i] = [resStart, resEnd]
find = true
break
}
}
// 교체가능한 방이 없다면 추가
if !find {
rooms.append([resStart,resEnd])
answer += 1
}
index += 1
}
return answer
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [3차] 방금그곡 Swift (1) | 2024.04.18 |
---|---|
[프로그래머스] 숫자 카드 나누기 Swift (1) | 2024.04.18 |
[프로그래머스] 시소 짝궁 Swift (0) | 2024.04.17 |
[프로그래머스] 마법의 엘리베이터 Swift (0) | 2024.04.17 |
[프로그래머스] 전력망을 둘로 나누기 Swift (0) | 2024.04.16 |