새소식

인기 검색어

프로그래머스/Lv.2

[Swift] 과제 진행하기

  • -

https://school.programmers.co.kr/learn/courses/30/lessons/176962

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

// 1. 다음과제.시작시간 - 현재과제.시작시간 = 과제실행가능시간
// 2. 현재과제.실행시간 - 과제실행가능시간 = 남은실행시간
// 2-1 남은실행시간 == 1
// 1. 로 돌아가 반복
// 2-2 남은실행시간 > 0
// pasueTask.append(현재과제) 현재과제.실행시간 = 남은실행시간
// 2-3 남은실행시간 < 0
// 멈춘과제 = pasueTask.removeLast()
// 멈춘과제.실행시간 - 남은실행시간
// 2로 반복

import Foundation

struct Plan {
    let subject: String
    let startTime: Int
    var runningTime: Int
    
    init(subject: String, startTime: String, runningTime: String) {
        self.subject = subject
        let separatedTime = startTime.components(separatedBy: ":")
        self.startTime = Int(separatedTime.first!)! * 60 + Int(separatedTime.last!)!
        self.runningTime = Int(runningTime)!
    }
}

func solution(_ plans:[[String]]) -> [String] {
    
    var planList: [Plan] = plans
        .map { Plan(subject: $0[0], startTime: $0[1], runningTime: $0[2]) }
        .sorted { $0.startTime < $1.startTime }
    
    var pauseTask: [Plan] = []
    var result: [String] = []

    while true {
        var plan = planList.removeFirst()
        
        if planList.isEmpty {
            result.append(plan.subject)
            break
        }
        
        let runableTime = planList.first!.startTime - plan.startTime
        // 시간이 남으면 음수
        var remainingTime = plan.runningTime - runableTime
        
        if remainingTime == 0 {
            result.append(plan.subject)
            continue
        }
        else if 0 < remainingTime {
            plan.runningTime = remainingTime
            pauseTask.append(plan)
            continue
        } else {
            result.append(plan.subject)
            while !pauseTask.isEmpty  {
                var resumePlan = pauseTask.removeLast()
                remainingTime = resumePlan.runningTime + remainingTime
                
                if remainingTime <= 0 {
                    result.append(resumePlan.subject)
                    continue
                } else if 0 < remainingTime {
                    resumePlan.runningTime = remainingTime
                    pauseTask.append(resumePlan)
                    break
                }
            }
        }
    }
    pauseTask.reversed().forEach { result.append($0.subject) }
    
    return result
}

'프로그래머스 > Lv.2' 카테고리의 다른 글

[Swift] 혼자 놀기의 달인  (0) 2023.06.24
[Swift] 테이블 해시 함수  (0) 2023.06.24
[Swift] 미로 탈출  (0) 2023.06.24
[Swift] 문자열 압축  (0) 2023.06.23
[Swift] 시소 짝궁  (0) 2023.06.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.