TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 기능개발

여의도사노비 2023. 1. 8. 16:17
728x90

문제 옆에 쓰여있듯이 스택/큐와 관련된 문제이다.

스택은 LIFO, 큐는 FIFO의 성질을 지니고 있다.

 

문제 자체는 어렵지 않았고 앞의 원소가 뒤의 원소보다 작업값이 큰 경우 앞의 원소의 작업이  끝날때까지 기다렸다가 같이 나간다는 개념으로 생각하면 된다.

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 작업완료 상태인 100을 채우기 위해 각 원소별로 스피드 대비 몇일의 작업일이 남았는지 확인한다. 
  2. 첫 for문의 경우 criteria가 0이기 때문에 무조건 criteria에 첫 원소의 남은 작업일인 day를 대입해준다.
  3. 다음 원소부터 기준이 되는 criteria와 day간의 비교를 통해 day가 값이 낮을 경우 앞의 원소를 기다려야하기 때문에
  4. 1을 추가해 특정 날짜에 완료될 업무의 개수를 누적해준다.
  5. 다른 원소의 날짜가 criteria의 날짜보다 오래 걸린다면 ans 배열에 다음 원소로 넘어가서 1을 추가해주고 새로운 기준을 잡아준다.

 

 

* 코드

import Foundation

func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
    var criteria: Int = 0
    var ans: [Int] = []
    for i in 0...progresses.count-1 {
        let day = Int(ceil((100 - Double(progresses[i])) / Double(speeds[i])))
        if day > criteria {
            criteria = day
            ans.append(1)
        } else {
            ans[ans.count-1] += 1
        }
    }
    return ans
}

 

 

정리(Today I Learned)

  1. 없음