[프로그래머스] 크기가 작은 부분 문자열

neoneoneo·2024년 2월 26일
0

kotlin

목록 보기
2/49

문제

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

나의 풀이

class Solution {
    fun solution(t: String, p: String): Int {
        var answer: Int = 0
        var charArray = t.toCharArray()
        var longArray = charArray.map {it.toString().toLong()}.toLongArray()
        var lengthOfp : Int = p.length

        for(i in 0..(t.length - (lengthOfp))) {         
            var subArray = longArray.copyOfRange(i, i+lengthOfp)
            var combinedNumber = subArray.joinToString("").toLong()

            if(combinedNumber <= p.toLong()) {
                answer++
            }
        }
        return answer
    }
}

고수의 풀이

class Solution {
    fun solution(t: String, p: String): Int {
        return (0..t.length - p.length)
            .map{ t.substring(it until it + p.length) }
            .count { it <= p }
    }
}

배운점

  • 숫자를 비교해야한다는 생각에 받을 변수 t, p를 숫자로 변환하는 것에 초점을 맞췄다.
    • 숫자로 변환하는 것보다는 String 형태지만 먼저 필요한 부분을 취하고, 그 이후 숫자로 변환한 후 비교 작업을 해도 되겠다.
      • 특히 이 부분은 subString을 쓰면 정말 간단하게 풀 수 있었다. 나는 String을 먼저 숫자로 바꾸느라 toCharArray(), map{} 작업을 하면서 푸는 시간이 길어졌다.
  • 숫자 비교하는 부분도 count{}를 쓰면 아주 간단히 해결 될 수 있었다. 굳이 for문을 써서 item에 하나씩 접근할 필요는 없었던 것 같다.
  • 배열을 하나씩 풀어서 변환하고, 비교하는 방식을 취했기 때문에 배열과 숫자의 type을 맞춰줘야 했다. 채점 할 때 보니 이유를 알 수 없는 런타임 에러가 계속 떴는데, 처음에 배열을 IntArray로 선언해서 사용했기 때문이었다. 이는 배열의 type을 Long으로 변환해서 해결했지만, 고수의 풀이를 보니 장황하게 변수의 타입까지 건드리지 않아도 해결 할 수 있는 문제였다.
    • 참고로, p의 길이가 1<=p<=18 였기 때문에 최대 18자리의 숫자가 입력될 수 있었고, 그렇다면 Int형으로는 그 크기가 부족했었다.

[TIL-240226]

0개의 댓글