https://school.programmers.co.kr/learn/courses/30/lessons/12918?language=kotlin
문제
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼 있는지 확인해 주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
제한 사항
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
풀이1
class Solution {
fun solution(s: String): Boolean = (s.length == 4 || s.length == 6) && s.toIntOrNull() != null
}
- 해당 문제는 Boolean 값만 반환해 주면 되기 때문에 따로 조건문을 쓸 필요 없이 위처럼 논리식을 이용하면 좋습니다.
- 위의 코드는 것 보기에는 좋아 보이지만 한 가지 흠이 있습니다. 그것은 toIntOrNull입니다. 밑의 결과를 보면 알다시피 중간 시간이 오래 걸리는 부분이 있을 것입니다. 이 부분은 toIntOrNull연산을 할 때 이렇게 시간이 오래 걸립니다.
/**
* Parses the string as an [Int] number and returns the result
* or `null` if the string is not a valid representation of a number.
*
* @throws IllegalArgumentException when [radix] is not a valid radix for string to number conversion.
*/
@SinceKotlin("1.1")
public fun String.toIntOrNull(radix: Int): Int? {
checkRadix(radix)
val length = this.length
if (length == 0) return null
val start: Int
val isNegative: Boolean
val limit: Int
val firstChar = this[0]
if (firstChar < '0') { // Possible leading sign
if (length == 1) return null // non-digit (possible sign) only, no digits after
start = 1
if (firstChar == '-') {
isNegative = true
limit = Int.MIN_VALUE
} else if (firstChar == '+') {
isNegative = false
limit = -Int.MAX_VALUE
} else
return null
} else {
start = 0
isNegative = false
limit = -Int.MAX_VALUE
}
val limitForMaxRadix = (-Int.MAX_VALUE) / 36
var limitBeforeMul = limitForMaxRadix
var result = 0
for (i in start until length) {
val digit = digitOf(this[i], radix)
if (digit < 0) return null
if (result < limitBeforeMul) {
if (limitBeforeMul == limitForMaxRadix) {
limitBeforeMul = limit / radix
if (result < limitBeforeMul) {
return null
}
} else {
return null
}
}
result *= radix
if (result < limit + digit) return null
result -= digit
}
return if (isNegative) result else -result
}
- 위코드는 toIntOrNull의 내부 코드입니다. 보시다시피 해당작업은 많은 작업들을 수행하기 때문에 밑에 결과처럼 많은 시간이 소모가 됩니다.
결과 1
풀이 2
class Solution {
fun solution(s: String): Boolean = (s.length == 4 || s.length == 6) && s.all { it.isDigit() }
}
- toIntOrNull을. all { it.isDigit() }로 바꿔 보았습니다. 해당작업을 보시다시피 시간이 확 줄어들었습니다. toIntOrNull은 값을 확인할 때도 쓰이기는 하지만 숫자를 반환하기 위해 더 많은 로직을 수행합니다. 위의 경우처럼 문자열에 숫자만 있는 경우를 찾기 위해서는 위의 방법이 효과적입니다.
결과 2
'코틀린 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - x만큼 간격이 있는 n개의 숫자 (Kotlin) (0) | 2023.08.03 |
---|---|
[프로그래머스] - 없는 숫자 더하기 (Kotlin) (0) | 2023.08.03 |
[프로그래머스] - 두 정수 사이의 합 (Kotlin) (0) | 2023.08.03 |
[프로그래머스] - 직사각형 넓이 구하기 (Kotlin) (0) | 2023.08.02 |
[프로그래머스] - [1차] 비밀지도 (Kotlin && JAVA) (0) | 2023.08.02 |