본문 바로가기
코딩테스트 준비(kotlin)/자료구조

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

by 1chanhue1 2024. 6. 23.

문제 푸는데 걸린시간 : 40분, 큐 peek ,poll 함수를 까 먹어서 찾는데 시간이 걸림 + ceil(올림 함수도)

아이디어 도출 : 5분 , 큐를 사용하여 어떤 형식으로 큐에 값을 넣을지 생각함. 

package com.example.codingtest_practice1.programmers.level2
import java.util.LinkedList
import java.util.Queue
import kotlin.math.*
// 기능 개발

// 걸린시간 40분 , 문제 구현 35분 아이디어 도출 5분
fun solution_dd(progresses: IntArray, speeds: IntArray): IntArray {
    var answer = intArrayOf()
    var days= intArrayOf()
    val queue:Queue<Int> = LinkedList()
    
    for(i in 0..progresses.size-1){
        days=days+ceil((100 - progresses[i]) / speeds[i].toDouble()).toInt()
    }

    for(i in 0 until days.size){
        queue.add(days[i])
    }
    while(queue.isNotEmpty()){
        val value=queue.poll()
        var count=1
        while (queue.isNotEmpty()){
            if(value>=queue.peek()){
                queue.poll()
                count++
            }
            else{
                answer=answer+count
                break
            }

        }
        if(queue.isEmpty()){ // 마지막의 경우임 
            answer=answer+count
        }
    }
    return answer
}

문재해결 POINT

//    days 라는 배열을 선언하여, ceil((100 - progresses[i]) / speeds[i].toDouble()).toInt()값을 저장한다.

//    여기서 이 값은, ((100 - 작업 진도) / 작업 속도) 의 값의 올림한 값이다 ,  이 days 값을 큐에 넣고 시작한다.

//    while문은 이중 중첩으로 되어 있는데, 첫번재 while문은 큐가 빌 때 까지 진행한다.

//    만저 큐에서 poll 한 후 count를 1로 초기화 한후 다음 while문으로 들어가게 된다

//    이때 value의 값과 peek한 값을 비교 하게 되는데 value의 값이 크거나 같은 경우 즉. 앞에 있는 모든 기능이 완성되지 않은 경우이다.

//    이 경우 poll하고 count를 증가 시킨다.

//    value가 작은 경우는 앞에 있는 기능이 완료된 경우 이므로 answer 배열에 추가 시킨다.

//    마지막의 경우에는 queue 경우 이므로 answer 추가하지 못하므로 if조건 문을 넣어 추가시칸다.