https://school.programmers.co.kr/learn/courses/30/lessons/12931
위 문제를 푸는데 의도한 값과 다르게 나와서 확인해보았다.
문제는 숫자의 각 자릿수를 더한 값을 반환하는 문제이다.
입력 : 123
결과 : 6 (= 1 + 2 + 3)
이 문제를 풀기 위해 생각한 흐름은 다음과 같다.
1. 함수에 받아 온 Int 값을 String으로 변환한다
2. String을 문자 하나씩 쪼개어 배열이나 리스트로 만든다
3. forEach로 배열이나 리스트를 순회하여 값을 더한다
class Solution {
fun solution(n: Int): Int {
var answer = 0
val intString = n.toString()
val splitList = intString.toList()
splitList.forEach{answer += it.toInt()}
return answer
}
}
123이 입력되었을때 위 코드의 결과는 150이었다. 왜 이렇게 큰 차이가 나게 되었을까?
String타입에 toList()를 사용하면List<Char> 타입을 반환한다.
그리고 Char타입을 toInt()로 변환하면 ASCII 코드 값으로 변환된다.
따라서, '1' -> 49 로 변하게 된다.
class Solution {
fun solution(n: Int): Int { // n = 123
var answer = 0
val intString = n.toString() // intString = "123"
val split = intString.toList() //split = ['1', '2', '3']
split.forEach{answer += it.toInt()} // answer = 49 + 50 + 51
return answer //150
}
}
class Solution {
fun solution(n: Int): Int {
var answer = 0
val intString = n.toString()
val splitList = intString.chunked(1)
splitList.forEach{answer += it.toInt()}
return answer
}
}
Char타입의 숫자값을 유지하여 Int타입으로 바꾸는 방법들도 있지만 chunked() 메소드를 알게 되어 적용해보았다.
chunked()는 주어진 크기만큼 콜렉션을 나눠 리스트로 만들어주는 메소드이다. String 타입의 경우 주어진 크기만큼 문자열을 잘라 List<String>타입을 반환한다. String타입을 toInt()로 변환할때는 값이 유지되기 때문에 정상적으로 작동했다.