프로그래머스

기능개발

끝까지 처음처럼 2022. 9. 27. 14:01
728x90
class Solution {
    fun solution(progresses: IntArray, speeds: IntArray): IntArray {
        var answer = intArrayOf()
        var tempProgresses = progresses.toMutableList()
        var tempStart = 0
        while(true){
            for(i in 0 .. tempProgresses.size-1){
                tempProgresses[i] += speeds[i]
            }
            if(tempProgresses[tempStart] >= 100){
                var count = 0
                for(j in tempStart .. tempProgresses.size-1){
                    if(tempProgresses[j]>= 100){
                        count += 1
                    } else {
                        tempStart = j
                        break
                    }
                }
                answer += count
            }
            if(tempProgresses.count{e-> e >= 100} == tempProgresses.size) break
        }
        
        return answer
    }
}

해당 문제는 현재 저의 실력으로 풀었으며, 최선의 방법은 아닐 수 있음을 말씀드립니다.

 

추가-----------------------------------------------------------------------------------------------------------------------------------------------------------

 

Deque를 공부하고 나서 해당문제를 Deque를 사용하여 작성해보았습니다.

import java.util.*
class Solution {
    fun solution(progresses: IntArray, speeds: IntArray): IntArray {
        var answer = intArrayOf()
        var pro = ArrayDeque<Int>()
        var speed = ArrayDeque<Int>()
        
        //자료입력
        for(i in 0 .. progresses.size-1){
            pro.addLast(progresses[i])
            speed.addLast(speeds[i])
        }
        var count = 0
        while(pro.size != 0){
            if(pro.peekFirst() >= 100){
                for(i in 1 .. pro.size){
                    if(pro.peekFirst() >= 100){
                        pro.removeFirst()
                        speed.removeFirst()
                        count++
                    } else {
                        break
                    }
                }
                answer += count
                count = 0
            } else{
                for(i in 1 .. pro.size){
                    pro.addLast(pro.pollFirst() + speed.peekFirst())
                    speed.addLast(speed.pollFirst())
                }
            }  
        }
        return answer
    }
}

처음 작성하였던 코드의 실행시간

테스트 1 통과 (14.76ms, 65.7MB)
테스트 2 통과 (14.91ms, 65.3MB)
테스트 3 통과 (17.35ms, 64.7MB)
테스트 4 통과 (17.58ms, 65.4MB)
테스트 5 통과 (16.57ms, 65.5MB)
테스트 6 통과 (19.54ms, 64.7MB)
테스트 7 통과 (20.89ms, 65.1MB)
테스트 8 통과 (16.06ms, 65.2MB)
테스트 9 통과 (15.28ms, 66.9MB)
테스트 10 통과 (20.30ms, 65.1MB)
테스트 11 통과 (15.52ms, 66.4MB)

 

Deque를 사용하여 작성한 코드의 실행시간

테스트 1 통과 (9.29ms, 62.2MB)
테스트 2 통과 (10.61ms, 63.5MB)
테스트 3 통과 (10.80ms, 63.4MB)
테스트 4 통과 (9.95ms, 63.6MB)
테스트 5 통과 (10.12ms, 63.3MB)
테스트 6 통과 (10.55ms, 64.9MB)
테스트 7 통과 (15.72ms, 63.4MB)
테스트 8 통과 (11.59ms, 63MB)
테스트 9 통과 (11.61ms, 62.8MB)
테스트 10 통과 (11.11ms, 63.1MB)
테스트 11 통과 (13.58ms, 61.8MB)

 

실행시간을 비교해보면 자료의 량이 많지 않아 확 눈에 띄지는 않지만 대부분의 실행시간이 줄어들었다는 것을 확인 할 수 있었습니다.

Deque를 공부하게 되면서 자료구조의 중요성 등을 다시금 깨닫게 되는 문제 였던것 같습니다.

 

알고리즘의 문제들 중에서 조건에 만족하면 삭제를 해야되는 경우 Deque를 사용하면 시간초과에 대한 문제에 대하여 비교적 쉽게 해결 할 수 있을거라고 생각이 듭니다.