본문 바로가기
스터디(programmers)

Kotlin] 프로그래머스 lv.2, 기능 개발

by 김마리님 2023. 3. 20.

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

 

프로그래머스

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

programmers.co.kr

 

풀이

더보기

사실 코틀린은.. 큐 기능을 제공하지 않는다.

그렇기 때문에 사실 ArrayList로 풀어도 별 문제가 되지 않지만,, 자바 라이브러리의 ArrayList를 가져와서 써봤다.

 

그럼 왜 이 문제가 스택 / 큐의 문제이냐,,

문제에 나와있는데, '이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.'

라는 문구 때문이다. 즉, 첫번째 기능이 7일만에 개발되고, 두 번째 기능이 3일만에 개발되었어도, 두 번째 기능을 우선 배포할 수 없고, 첫번째 기능이 배포되었을 때 함께 배포되어야만 한다.

 

그럼 문제를 어떻게 풀건데?

두 가지 방법이 있겠다.

1. 진행값을 큐에 넣고 while 문등을 통해 큐 내부의 값들을 일자별로 더해간다.

큐의 첫 번째 요소가 100이 넘어가는 시점에, 뒤에서 100이 되는 모든 값들을 poll 하면서 poll된 값의 갯수를 찾는다.

그러면 아직 배포가 덜 된 값들만 남게 되는데, 이를 큐가 빌 때 까지 반복한다.

 

2. 각 요소의 완료일자를 계산한다. 이를 큐로 저장한다.

큐의 첫번째 요소를 빼고, 이 요소를 저장한다.

뒤의 큐들을 비교하며(peek) 빼버린 큐보다 더 값이 낮다면 해당 요소도 빼버리면서(poll) 첫 번째 요소보다 일찍 완성된 작업을 전부 빼버리고, 뺀 값들의 갯수를 찾는다.

그러면 배포가 덜 된 값들만 남게 되는데, 이를 큐가 빌 때 까지 반복한다.

 

나는 2번이 좀 더 간단할 것 같아서 2번으로 함.

 

import java.util.concurrent.LinkedBlockingQueue
import kotlin.math.ceil

class Solution {
    fun solution(progresses: IntArray, speeds: IntArray): IntArray {
        var answer = arrayListOf<Int>()
        var linkedQueue = LinkedBlockingQueue<Float>()

        //스택 큐? 로 굳이 풀어야 하나?
        progresses.forEachIndexed { index, i ->
            var day = ceil((100 - i).toFloat() / speeds[index])
            println(day)
            linkedQueue.put(day)
        }

        while (!linkedQueue.isEmpty()) {
            var finishedDay = linkedQueue.poll()
            var finished = 1 // 값 하나가 빠지고, 기능 하나가 완료됐음.

            while (!linkedQueue.isEmpty() && linkedQueue.peek() <= finishedDay) {
                linkedQueue.poll()
                finished++
            }

            answer.add(finished)

        }

        println(answer)
        return answer.toIntArray()
    }
}

 

반응형