크기가 작은 부분문자열

KSang·2023년 12월 9일
0

[Kotlin]코드카타

목록 보기
42/100

🕵️문제설명

숫자로 이루어진 문자열 tp가 주어질 때, 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
tp는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

🔎로직설명

최초 코드

import kotlin.math.pow

fun solution(t: String, p: String): Int {
    var answer: Int = 0
    val a = t.toCharArray()
    for (i in 0 until a.size-p.length+1){
        var x = 0
        var k = 1
        for (j in i until i+p.length){
            x += Character.getNumericValue(a[j]) * 10.0.pow(p.length-k).toInt()
            k++
        }
        if (x <= p.toInt()){
            answer++
        }
    }
    return answer
}

그냥 아주 단순하게 직관적으로 생각난 방법

그래서 코드가 길고 비효율적이다

문자열을 char배열로 받은 뒤 i(부분문자열의 시작점)의 범위를 지정한뒤 반복

p의 자릿수 만큼 반복하는 반복문을 만들고 p[j] 10을 크기에 맞게 n제곱 해준뒤 x에 더한다

이때 p[j]를 그냥 정수로 변환하면 char타입이라 아스키코드값이 나오니 Character.getNumericValue를 사용한다 toString().toInt()를 사용해도됨

Character.getNumericValue는 숫자가 아닐때 -1를 반환한다는 차이점이있다.

그리곤 비교해서 answer값 증가

pow대신 계산후 x의 크기를 10씩 곱해주면 임포트를 안해도되고 k도 없어도 되서좀더 깔끔해질것 같다

1차 수정

fun solution(t: String, p: String): Int {
    var answer: Int = 0
    val a = t.toCharArray()
    for (i in 0 until a.size-p.length+1){
        var x = 0
        for (j in i until i+p.length){
            x = x*10 + a[j].toString().toInt()
        }
        if (x <= p.toInt()){
            answer++
        }
    }
    return answer
}

x를 10씩 곱해줘 pow를 쓰지않고 정수만 입력하니 toString().toInt()로 바꿧다

2차 수정 최종

fun solution(t: String, p: String): Int {
    var answer: Int = 0
    for (i in 0 until t.length-p.length+1){
        val a = t.substring(i, p.length + i).toInt()
        if (a <= p.toInt()){
            answer++
        }
    }
    return answer
}

subString을 이용해 문자를 배열로 받지않고 String타입으로 작업을 수행

a는 i~p.length+i 인 길이의 문자

0개의 댓글