문제
1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ i < j ≤ 100,000
- 0 ≤ k ≤ 9
입출력 예
코드
class Solution {
fun solution(i: Int, j: Int, k: Int): Int {
var answer: Int = 0
var sb = StringBuilder()
for(element in i..j){
sb.append(element.toString())
}
for(s in 0 until sb.length){
if(sb[s].toString().toInt() == k){
answer++
}
}
return answer
}
}
나는 i부터 j까지의 숫자를 문자열로 바꿔서 StringBuilder에 저장했다.
그리고 StringBuilder만큼 반복하며 하나씩 쪼개서 그 값이 k라면 answer에 1을 더했다.
더 간단한 풀이가 있을 것 같아서 찾아봤는데 역시나 한줄 코드가 있었다.
class Solution {
fun solution(i: Int, j: Int, k: Int): Int = (i..j).joinToString("").count { it.digitToInt() == k }
}
이 코드는 i부터 j까지 joinToString을 이용해 리스트의 원소들을 모두 연결한 하나의 문자열로 만든다.
그리고 count를 이용해 { } 안에 있는 조건들을 만족할 때마다 카운트를 세어준다.조건은 it.digitToInt() == k 로 digitToInt() 를 사용하여 명시적으로 Int 숫자로 변환해주고 그 수가 k와 같다면 count에 의해 +1 이 된다.
내가 처음 보는 함수들이라서 꼭 기억해두고싶다.
기억하고 싶은 부분
- joinToString()
(하나로 합치고 싶은 것).joinToString("무엇으로 구분 지을 것인지")
예시로
(1..3).joinToString("") 이면
1~3까지 ""로 연결해달라는 의미이므로
123 을 출력할 수 있을 것이다.
(1..3).joinToString(",")이면
1,2,3 을 출력할 것이다.
- digitToInt()
(숫자로 바꾸고싶은 것).digitToInt()
https://school.programmers.co.kr/learn/courses/30/lessons/120887
'Algorithm > kotlin' 카테고리의 다른 글
[프로그래머스/Kotlin] 가까운 수 (Lv. 0) (0) | 2024.02.13 |
---|---|
[프로그래머스/Kotlin] 모스부호 (1) (Lv. 0) (0) | 2024.02.09 |
[프로그래머스/Kotlin] A로 B 만들기 (Lv. 0) (0) | 2024.02.09 |
[프로그래머스/Kotlin] 2차원으로 만들기 (Lv. 0) (2) | 2024.02.09 |
[프로그래머스/Kotlin] 배열 회전시키기 (Lv. 0) (0) | 2024.02.07 |