[Swift] 프로그래머스(Lv3) - [1차] 셔틀버스 (2018 KAKAO BLIND RECRUITMENT )

Kerri·2021년 7월 29일
0

코테

목록 보기
65/67

안녕하세요 :)

https://programmers.co.kr/learn/courses/30/lessons/17678

풀이

먼저 제일 바깥 반복문을 어떤 걸로 할지 정해야합니다.
문제에서 버스가 총 n회 운행한다고 했습니다. 운행하는 각 버스마다 사람을 태워야 하므로 1부터 n까지 돌아야 하는데...
(물론 n을 돌다가 timetable에 있는 사람들을 이미 다 태웠으면 break 해주면 되겠습니다. )
그런데.. 우리는 버스가 출발하는 시각 기준으로 사람들을 태울 수 있는지 없는지 확인해야 하기 때문에 버스가 출발하는 시간으로 바꿔줘야 문제가 풀기 편해집니다.
=> 제일 바깥 반복문을 bustime 배열로 하자!

  1. 버스는 09:00 시간에 1회차 버스가 출발합니다.
    09:00 부터 t분 간격인 bustime n개를 배열로 만들어줍니다.
  2. HH:MM 을 분 단위로 바꿔줍니다. 그리고 오름차순으로 sort 합니다.
  3. bustime 배열을 돌면서 count(현재 탄 사람)가 m(최대 태울수 있는 사람수) 보다 작다면
    index 와 count를 하나씩 늘려줍니다.
  4. 1) count < m 인 경우
    사람이 덜 탄 경우이죠? 그래서 최대로 늦게 탈 수 있는 시간을 answer로 해줘야 합니다.
    최대로 늦게 탈 수 있는 시간은 뭘까요? 바로 현재 bustime입니다.
    answer = bustime
    2) count >= m 인 경우
    사람이 꽉 찬 경우인데 콘이 버스를 타야하죠 ? 콘이 버스를 탈려면 현재 index-1 번째 사람 도착시간 보다 1분이 작아야합니다.
    왜 그럴까요? 지금 index 위치 일때 count가 m을 넘어섰는데 그럼 count가 m보다 크지 않았을 때는 index - 1 위치입니다. (index -1 번째 사람까지 태움)
    근데 콘은 그 index -1 번째 사람을 제치고 버스를 타야합니다. 그러려면 index -1 번째 사람 도착시간보다 적어야 겠죠? 1분만 빨리도착하면 탈 수 있으니까 times[index-1] - 1 이 answer가 됩니다.
    (제일 늦게 도착하는 시간을 구하는거니까 1만 빼준다. 10분을 먼저 도착해도 콘은 탈수 있지만 그건 제일 늦게 도착하는 시간이 아니므로)
    answer = times[index-1] - 1
import Foundation

func formatMinute(_ str: String) -> Int {
    let arr = Array(str)
    let hour = Int(String(arr[..<2]))!
    let minute = Int(String(arr[3...]))!
    return hour * 60 + minute
}

func solution(_ n:Int, _ t:Int, _ m:Int, _ timetable:[String]) -> String {
    let busTime: [Int] = {
        let start = 9 * 60
        var arr = [Int]()
        for num in 0..<n {
            arr.append(start + num * t)
        }
        return arr
    }()

    var index = 0
    let times = timetable.map { formatMinute($0) }.sorted()
    var answer = 0
    
    for bt in busTime {
        var count = 0
        
        while index < times.count && count < m && times[index] <= bt {
            index += 1
            count += 1
        }
        
        answer = count < m ? bt : times[index - 1] - 1
        
        if index > times.count { break }
       
    }
    let hour = String(format: "%02d", answer / 60)
    let minute = String(format: "%02d", answer % 60)
    
    return "\(hour):\(minute)"
}
profile
안녕하세요 !

0개의 댓글