본문 바로가기

코딩테스트

[프로그래머스] 기능 개발

난이도 : Lv 2

분류 : 스택 / 큐

 

문제

 

 

프로그래머스

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

programmers.co.kr

 

 코드

 
import Foundation

func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
    var tmpProgresses: [Int] = progresses
    var tmpSpeeds: [Int] = speeds
    var tmpCnt: Int = 0
    var result: [Int] = []
    
    while true {
    // while 문을 사용해 매일매일 진행한다.
        if tmpProgresses.isEmpty {
            if tmpCnt > 0 {
                result.append(tmpCnt)		// 완성할 작업이 없는 경우 마지막에 기록된 개수를 기록
            }
            break		// 루프를 빠져나간다.
        }
        
        if tmpProgresses[0] < 100 {
        // 제일 처음 작업이 완료되지 않았다면 다음을 실행한다.
            if tmpCnt > 0 {
                result.append(tmpCnt)		// 하루에 완료된 작업의 개수를 기록
            }
            tmpCnt = 0		// 첫 작업이 완료되지 않았기 때문에 완료 개수를 0으로 변경
            for (workIdx, load) in zip(0..<tmpSpeeds.count, tmpSpeeds) {
            // for 문을 사용해 목록에 있는 하루치 작업들을 진행한다.
                tmpProgresses[workIdx] += load		// 작업에 맞는 작업 속도를 더한다.
            }
        } else {
        // 제일 처음 작업이 완료되었다면 다음을 실행한다.
            tmpProgresses.removeFirst()		// 완료된 작업 제외
            tmpSpeeds.removeFirst()		// 작업 속도도 마찬가지로 제외
            tmpCnt += 1		// 하루에 완료된 작업의 개수를 증가
        }
    }
    
    return result		// 결과를 return 한다.
}

 

풀이

1. Progresses 와 Speeds 는 길이가 같다. == 작업별 개발 속도가 정해져 있다.

2. 제일 첫 작업이 완료되지 않으면 뒤의 작업이 100%가 되어도 배포할 수 없다. == Progresses[0] >= 100 이 되어야 배포 시작 가능함.

 

P.S

2단계 문제답지 않게 쉬운 문제였으며, 여러 방법으로 풀이가 가능하다.

고차함수를 활용해서 코드 라인을 더 줄여봐야겠다.