본문 바로가기
PS/카카오 기출

[카카오 기출] Swift - 셔틀 버스

by kayahn0126 2023. 8. 27.

셔틀버스

  • 구현
  • 시간 계산

🍎 지문 해석

  • 게으른 콘은 항상 마지막으로 버스를 타고 싶다.
  • 이런 콘을 위해서 언제 버스를 타야 회사는 가면서 가장 마지막으로 탈 수 있는지 알려주는 프로그램을 구현하면 된다.
  • 셔틀은 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)
}