프로그래머스 - 크기가 작은 부분 문자열(with Kotlin)

Purang·2023년 2월 8일
0

Programmers

목록 보기
2/5

문제 설명
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

제한사항
1 ≤ p의 길이 ≤ 18
p의 길이 ≤ t의 길이 ≤ 10,000
t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

입출력 예
t p result
"3141592" "271" 2
"500220839878" "7" 8
"10203" "15" 3

문제 생각
t의 문자열을 p의 길이 만큼 반복하여 자른 후 잘라서 나온 그 수를 p를 int로 변환 시킨 것과 작거나 같을 경우 정답배열에 넣는 방식을 생각하였습니다.

답변 코드

class Solution {
    fun solution(t: String, p: String): Int {
        val answerArr = arrayListOf<Long>()
        val tempArr = arrayListOf<String>()
        val pi = p.toLong()
        for (i in t.indices) {
            if (i + p.length <= t.length) {
                val ts = t.slice(i until i + p.length)
                if (ts.toLong() <= pi) {
                    answerArr.add(ts.toLong())
                }
                //tempArr.add(ts)
            }
        }
        /*val an = tempArr.filter {it.toLong() <= p.toLong()}
        for (j in an.indices) {
            answerArr.add(an[j].toLong())
        }*/
    
        return answerArr.size
    }
}

주석을 제외한 if (ts.toLong() <= pi) {answerArr.add(ts.toLong())} 으로 조건을 체크하는 방법과 위 if문을 지우고 주석 처리된 코드를 사용하여 해결하는 방법을 생각하였습니다.
제한사항의 t와 p의 길이가 길기 때문에 Long타입을 사용하는 것이 중요합니다.

다른 분들 풀이
subString을 통해 푸시거나 IntRange를 0..t.length - p.length..등의 다양한 방식을 사용하여 간결한 코드를 만들어 내는 것을 보았습니다.
열심히 공부하여 효율적인 코드에 한 발짝 씩 다가가 보도록 하겠습니다.

profile
몰입의 즐거움

0개의 댓글