프로그래머스

[프로그래머스][kotlin] 뒤에 있는 큰 수 찾기

끝까지 처음처럼 2023. 1. 30. 15:02
728x90
import java.util.*
class Solution {
    fun solution(numbers: IntArray): IntArray {
        var result = ArrayDeque<Int>()
        var stack = ArrayDeque<Int>()
        for(i in numbers.size-1 downTo 0){
            while(!stack.isEmpty()){
                if(stack.peekLast() > numbers[i]){
                    result.add(stack.peekLast())
                    stack.add(numbers[i])
                    break
                } else {
                    stack.removeLast()
                }
            }
            if(stack.isEmpty()){
                result.add(-1)
                stack.add(numbers[i])
            }
        }
        var answer = IntArray(numbers.size)
        for(i in 0 .. answer.size-1){
            answer[i] = result.pollLast()
        }
        return answer
    }
}

상기문제의 경우 타이밍이 매우 좋았다고 말씀 드릴 수 있습니다.

문제풀기 전날 스터디에서 해당 문제와 거의 동일한 백준의 오큰수 문제에 대하여 설명을 들었기에 간단히 풀 수 있었습니다.(매우 날먹(?)한 문제)

해당 문제의 경우 아이디어만 있다면 쉽게 풀 수 있는 문제였습니다. 

포인트로는 numbers 를 거꾸로 조회하면서 Stack(상기 코드에서는 Deque를 Stack처럼 사용) 내에 "뒷 큰수" 를 

저장 및 pop 하여 answer 에 저장하는 것입니다.

알고리즘 문제를 풀면서 느끼는거는 아이디어의 차이가 해당 문제의 난이도를 쉽게 푸느냐 어렵게 푸느냐도 결정하는게 크구나라고 생각하였습니다.

상기 코드의 실행결과 입니다.

테스트 1 통과 (0.09ms, 62.4MB)
테스트 2 통과 (0.10ms, 58.5MB)
테스트 3 통과 (0.07ms, 60.6MB)
테스트 4 통과 (0.62ms, 59.1MB)
테스트 5 통과 (1.68ms, 61.5MB)
테스트 6 통과 (6.88ms, 62.7MB)
테스트 7 통과 (8.35ms, 62.7MB)
테스트 8 통과 (24.20ms, 77.5MB)
테스트 9 통과 (20.73ms, 74.4MB)
테스트 10 통과 (34.28ms, 90MB)
테스트 11 통과 (36.93ms, 88.2MB)
테스트 12 통과 (48.70ms, 106MB)
테스트 13 통과 (51.98ms, 103MB)
테스트 14 통과 (103.56ms, 135MB)
테스트 15 통과 (131.49ms, 185MB)
테스트 16 통과 (104.31ms, 185MB)
테스트 17 통과 (92.35ms, 185MB)
테스트 18 통과 (115.80ms, 187MB)
테스트 19 통과 (107.94ms, 186MB)
테스트 20 통과 (64.53ms, 180MB)
테스트 21 통과 (82.47ms, 169MB)
테스트 22 통과 (74.03ms, 150MB)
테스트 23 통과 (82.45ms, 170MB)