[Kotlin/프로그래머스] 코딩테스트 연습 > 스택/큐 > 기능개발

👀 문제

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

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import kotlin.math.ceil

class Solution {
    fun solution(progresses: IntArray, speeds: IntArray): IntArray {
        /*
        day[i] = (100-p[i])/s[i].toFloat
        day[i] = ceil(day[i])
        cnt = 1 temp = day[0]
        for i =1 ~
        if (temp>day[i]) -> cnt ++
        else -> temp = day[i], answer.add(cnt), cnt = 1
        answer.add(cnt)
         */

        val answer = arrayListOf<Int>()
        val n = progresses.size
        val day = IntArray(n)
        for (i in 0 until n) {
            val temp = (100 - progresses[i]) / speeds[i].toFloat()
            day[i] = ceil(temp).toInt()
        }
    
        var temp = day[0]
        var cnt = 1
        for (i in 1 until n) {
            if (temp >= day[i]) {
                cnt++
            } else {
                answer.add(cnt)
                temp = day[i]
                cnt = 1
            }
        }
        answer.add(cnt)
        return answer.toIntArray()
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 작업일 수 계산
    • 남은 작업일 수는 (100-p[i]/s[i].toFloat()) 를 올림(ceil)한 것과 같다.
    • 소수점 아래 값을 받기 위해 나눌 값을 float형으로 변환한다.
    • 이후 ceil() 메소드를 통해 올림 처리를 해준다.
  2. 작업일 수 체크
    • 0 번째 인덱스로 temp(지금까지 필요한 작업일), cnt(그 개수)를 초기화 한다.
    • 1부터 n 까지 확인하며 temp>=day[i]면 day[i]를 temp에 포함시킬 수 있으므로 cnt ++,
    • 아니라면 지금까지의 cnt를 answer에 저장하고, day[i]를 기준으로 temp와 cnt를 초기화한다.
  3. 마지막 cnt도 포함
    • for문이 종료된 후 마지막 값은 answer에 반영되지 않았기 때문에 이를 포함한다.

👏 해결 완료!