숫자로 이루어진 문자열 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으로 시작하지 않습니다.
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도 없어도 되서좀더 깔끔해질것 같다
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()로 바꿧다
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 인 길이의 문자