프로그래머스

크기가 작은 부분 문자열

끝까지 처음처럼 2022. 12. 22. 22:04
728x90
class Solution {
    fun solution(t: String, p: String): Int {
        var answer: Int = 0
        var tempString = ""
        t.forEach{
            tempString += it.toString()
            if(tempString.length == p.length){

                if(tempString.toLong() <= p.toLong()) answer++

                tempString = tempString.slice(1 .. tempString.length-1)   
            }
        }
        return answer
    }
}

상기 문제는 문제설명을 제대로 확인하지 않으면 런타임 에러가 발생하여 통과하지 못합니다.

문제 설명을 보면 p 의 길이는 최대 18자리 Int의 범위를 벗어나기 때문입니다.

 

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

 

상기 코드로 제출 하였을때 걸린 실행시간 입니다.

테스트 1 통과 (33.32ms, 62.7MB)
테스트 2 통과 (46.57ms, 63.2MB)
테스트 3 통과 (33.45ms, 62.8MB)
테스트 4 통과 (37.17ms, 62.9MB)
테스트 5 통과 (53.79ms, 60.6MB)
테스트 6 통과 (47.39ms, 64.7MB)
테스트 7 통과 (49.86ms, 64.1MB)
테스트 8 통과 (44.06ms, 63.2MB)
테스트 9 통과 (34.71ms, 62.8MB)
테스트 10 통과 (33.16ms, 62.4MB)
테스트 11 통과 (33.08ms, 61.5MB)
테스트 12 통과 (45.14ms, 63MB)
테스트 13 통과 (39.21ms, 64.2MB)
테스트 14 통과 (35.05ms, 62.3MB)
테스트 15 통과 (29.00ms, 62.3MB)
테스트 16 통과 (31.39ms, 64.1MB)
테스트 17 통과 (31.09ms, 62.2MB)
테스트 18 통과 (41.55ms, 62.2MB)
테스트 19 통과 (27.47ms, 61.3MB)
테스트 20 통과 (26.62ms, 61.4MB)
테스트 21 통과 (23.22ms, 61.7MB)
테스트 22 통과 (24.53ms, 61.3MB)
테스트 23 통과 (28.04ms, 62.6MB)
테스트 24 통과 (24.40ms, 61.3MB)
테스트 25 통과 (26.03ms, 60.8MB)
테스트 26 통과 (34.71ms, 61MB)
테스트 27 통과 (26.36ms, 62.7MB)
테스트 28 통과 (21.76ms, 60.5MB)
테스트 29 통과 (26.34ms, 61.5MB)
테스트 30 통과 (27.96ms, 63.9MB)
테스트 31 통과 (30.82ms, 61.5MB)
테스트 32 통과 (20.30ms, 61.1MB)
테스트 33 통과 (27.97ms, 63.3MB)
테스트 34 통과 (19.67ms, 62.3MB)
테스트 35 통과 (30.01ms, 62.3MB)
테스트 36 통과 (24.98ms, 63.4MB)
테스트 37 통과 (23.00ms, 63.7MB)
테스트 38 통과 (24.95ms, 63.6MB)

 최근 Deque를 공부중에 해당 문제 또한 Deque를 사용하여 작성 할 수 있을거라고 생각이 들어 풀어봤습니다.

import java.util.ArrayDeque

class Solution {
    fun solution(t: String, p: String): Int {
        var answer: Int = 0
        var deque = ArrayDeque<String>()
        t.forEach {
            deque.addLast(it.toString())

            if(deque.size == p.length){
                var temp = ""
                deque.forEach{
                    temp += it
                }
                if(temp.toLong() <=  p.toLong()) answer++
                deque.removeFirst()
            }
        }

        return answer
    }
}

Deque를 사용하여 풀었을때의 실행시간입니다.

테스트 1 통과 (14.05ms, 60.8MB)
테스트 2 통과 (15.70ms, 63.4MB)
테스트 3 통과 (12.44ms, 62MB)
테스트 4 통과 (12.71ms, 62.2MB)
테스트 5 통과 (12.60ms, 61.6MB)
테스트 6 통과 (16.24ms, 60.8MB)
테스트 7 통과 (36.54ms, 68.4MB)
테스트 8 통과 (10.93ms, 62.3MB)
테스트 9 통과 (14.55ms, 60.1MB)
테스트 10 통과 (5.19ms, 59.4MB)
테스트 11 통과 (25.15ms, 61.4MB)
테스트 12 통과 (42.03ms, 67.8MB)
테스트 13 통과 (26.08ms, 62.3MB)
테스트 14 통과 (19.71ms, 62MB)
테스트 15 통과 (21.14ms, 61.4MB)
테스트 16 통과 (15.62ms, 61.2MB)
테스트 17 통과 (24.66ms, 63.3MB)
테스트 18 통과 (19.40ms, 61.2MB)
테스트 19 통과 (8.04ms, 58.9MB)
테스트 20 통과 (9.19ms, 59.7MB)
테스트 21 통과 (2.47ms, 60.8MB)
테스트 22 통과 (8.18ms, 59.2MB)
테스트 23 통과 (9.92ms, 60.6MB)
테스트 24 통과 (2.91ms, 58.6MB)
테스트 25 통과 (4.02ms, 60.9MB)
테스트 26 통과 (3.14ms, 61.2MB)
테스트 27 통과 (5.48ms, 60MB)
테스트 28 통과 (2.87ms, 60.9MB)
테스트 29 통과 (2.81ms, 60.9MB)
테스트 30 통과 (10.34ms, 61.1MB)
테스트 31 통과 (2.42ms, 59.6MB)
테스트 32 통과 (2.83ms, 59.8MB)
테스트 33 통과 (3.81ms, 60.2MB)
테스트 34 통과 (3.82ms, 60.6MB)
테스트 35 통과 (3.89ms, 61.5MB)
테스트 36 통과 (4.28ms, 59.5MB)
테스트 37 통과 (3.91ms, 59.1MB)
테스트 38 통과 (2.64ms, 61.4MB)

실행시간을 비교하였을때 대략 최소 2배에서 9배까지 차이가 나는 것을 볼 수있습니다.

원인으로는 내부적으로 돌아가는 자료구조에 따른 차이로 알고있습니다.