본문 바로가기

알고리즘

[프로그래머스] 기능 개발 #코틀린 #kotlin #스택 #stack #level2

반응형

https://programmers.co.kr/learn/courses/30/lessons/42586?language=kotlin 

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

풀이

다음의 규칙을 따라 코드를 작성해봅시다.

  1. `(100 - 현재 진행률) / 진행 속도`로 남은 기간을 계산합니다. (소수점이 생길 경우 올림)
  2. 첫 번째 남은 일을 스택에 집어넣습니다. 이때 (남은 기간, counter) 형식으로 집어넣습니다.
  3. 남은 기간을 순회하며 stack top과 비교하여 남은 기간이 더 작은 경우 counter를 1 증가시키고, stack top이 더 작은 경우 stack에 요소를 추가합니다.
  4. stack에서 두 번째 요소만 남겨 정해진 형식으로 반환합니다.
import java.util.Stack

class Solution {
    fun solution(progresses: IntArray, speeds: IntArray): IntArray {
        val days = progresses.zip(speeds).map { (p, s) ->
            val left = 100 - p
            val div = left / s
            val mod = if (left % s > 0) 1 else 0
            div + mod
        }
        val stack = Stack<Pair<Int, Int>>()
        stack.add(Pair(days.first(), 1))

        for (day in days.drop(1)) {
            if (day <= stack.peek().first) {
                val (a, b) = stack[stack.size-1]
                stack[stack.size-1] = Pair(a, b+1)
            }
            else {
                stack.add(Pair(day, 1))
            }
        }
        return stack.map { it.second }.toIntArray()
    }
}
반응형