셔틀버스
🍎 지문 해석
- 게으른 콘은 항상 마지막으로 버스를 타고 싶다.
- 이런 콘을 위해서 언제 버스를 타야 회사는 가면서 가장 마지막으로 탈 수 있는지 알려주는 프로그램을 구현하면 된다.
- 셔틀은 9시 정각에 한번오고 총 n회 t분 간격으로 온다.
- 예를 들면 총 2대가 오고 10분간격으로 온다면...
- 9시에 한대가 오고 9시 10분에 온다는 뜻이다.
- 그럼 그날 올 수 있는 버스는 모두 온것이다.
- 또, 만약 버스가 10시 10분에 도착한다면 크루가 10시 10분에 도착해도 버스를 탈 수 있다.
- n의 max = 10
- t의 max = 60
- m의 max = 45
🍎 문제 접근
- 시간 계산 문제는 항상 최소단위로 통일하고 계산해야 한다.
- 버스가 오는 시간을 busTime이라는 변수로 두고 이것(버스의 도착 시간)을 기준으로 사람들을 큐에서 빼주는 로직으로 구현
- 제일 중요한 로직
- 마지막 버스가 왔을때 콘이 탈 수 있는지 없는지가 중요하다
- 마지막 버스 + 탈 자리가 있다면 해당 버스가 도착하는 시간에 콘이 버스에 타면 된다.
- 마지막 버스 + 탈 자리가 없다면 마지막으로 탔던 인원보다 1분 일찍오면 콘이 탈 수 있다.
🍎 문제 풀이 및 전체 코드
- 자세한 설명은 각 코드에 주석으로 정리해두었다.
import Foundation
//MARK: 문자열로 된 시간을 ":" 기준으로 나누고 초 단위로 통일
func strToInt(_ time: String) -> Int {
let temp = time.split(separator: ":").map { Int(String($0))! }
return (temp[0] * 60) + temp[1]
}
//MARK: 숫자(초 단위)로 된 result를 String 타입으로 바꿔준다.
func intToStr(_ result: Int) -> String {
var resultInString = ""
let hour = result / 60
let minute = result % 60
if hour < 10 {
resultInString += "0\(hour):"
} else {
resultInString += "\(hour):"
}
if minute < 10 {
resultInString += "0\(minute)"
} else {
resultInString += "\(minute)"
}
return resultInString
}
func solution(_ n: Int, _ t: Int, _ m: Int, _ timetable: [String]) -> String {
var timeArr = [Int]()
for time in timetable {
timeArr.append(strToInt(time)) // 초 단위로 통일
}
timeArr.sort() // 앞에서 순서대로 빼주기 위해서 오름차순 정렬
var result = 0
var last = 0
var busTime = 540 // 기준점이 될 버스 시간.
for i in 0..<n {
var count = 0
for j in 0..<m {
// MARK: - 기다리는 사람이 있고 가장 앞에있는 사람이 버스 시간보다 먼저 기다리고 있던다면,
if !timeArr.isEmpty && timeArr.first! <= busTime {
last = timeArr.removeFirst()
count += 1
}
}
//MARK: 마지막 버스 && 탈 자리가 있다면 콘은 가장 늦은 시간인 버스 시간에 오면 된다.
if i == n - 1 && count < m {
result = busTime
//MARK: 마지막 버스 && 탈 자리가 없다면 마지막으로 버스에 탔던 인원보다 1분만 일찍 오면 된다.
} else if i == n - 1 && count == m {
result = last - 1
}
busTime += t // 다음 버스는 t시간이 지난 후에 오니 버스 시간에 오면 된다.
}
return intToStr(result)
}