반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.3) - [1차] 셔틀버스" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 구현 문제입니다. (아마?)
1. 편의를 위해 HH:mm 포맷을 분으로 변환합니다.
분으로 변환하는 이유는 시간의 비교를 쉽게 하기 위함입니다.
원래는 split()을 이용해 앞과 뒤를 나눴는데 다른 분의 prefix(), suffix()를 이용한 방법이 인상 깊어 수정했습니다.
2. 버스에 탑승한 사람을 저장하는 배열을 만듭니다.
버스에 탑승한 사람을 배열에 넣습니다.
이미 떠나 보낸 사람은 관심이 없으므로 매 반복마다 초기화 해줍니다.
제가 필요한 건 마지막에 탄 버스일 뿐입니다.
3. 버스 운영 횟수 만큼 반복하며 마지막에 타는 사람들을 구합니다.
timetable의 원소를 하나씩 살펴보며 버스에 태울 수 있는지 없는지 판단합니다.
현재 시간보다 같거나 빠른 시간에 줄을 선 사람은 버스에 태울 수 있습니다.
만약 탑승 가능 인원을 초과했다면 버스를 떠나 보냅니다.
4. 마지막 사람들의 최대 시간 -1 이 정답입니다.
마지막에 탄 사람들 중 한 명만 제외시키고 그 자리에 콘을 넣으면 됩니다.
따라서 가장 늦게 탄 사람의 시간 -1분이 콘의 시간입니다.
만약 table 배열이 비어있다면 (버스에 탄 사람이 없다면) 현재 시간에 출발합니다.
13번 테스트 케이스는 마지막에 탄 사람들의 수가 m을 넘지 않았을 때입니다.
이 상황에서는 마지막 한 명을 버리지 않아도 되므로 현재 시간에 출발해도 됩니다.
후기
문제를 한 번 읽고서는 이해가 힘든 문제였습니다. 국어 지문 읽는 느낌이라 어지럽더라고요.
구현 문제가 은근 신경이 많이 쓰이는 것 같아요.
감사합니다!
전체 코드
import Foundation
func createTimeString(_ min: Int) -> String {
return String(format: "%02d:%02d", min/60, min%60)
}
func solution(_ n:Int, _ t:Int, _ m:Int, _ timetable:[String]) -> String {
//String -> Int 분으로 변환
var timetable: [Int] = timetable.map {
Int($0.prefix(2))! * 60 + Int($0.suffix(2))!
}.sorted()
var table: [Int] = []
var sumOfMin = 540
for _ in 0..<n { //버스 운영 횟수
table = []
for time in timetable {
//탑승 가능 인원 만큼 태웠다면 break
//다음 회차 시간이라면 break
guard table.count < m, time <= sumOfMin else {
break
}
table.append(timetable.removeFirst())
}
sumOfMin += t
}
sumOfMin -= t
if let max = table.max(), table.count == m {
return createTimeString(max - 1)
} else {
return createTimeString(sumOfMin)
}
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형