코딩테스트

프로그래머스 하샤드 수

다시은 2023. 12. 20. 11:15

 
하샤드 수
: 자릿수의 합으로 나누어지는 양의 정수
 
 
처음 코드

class Solution {
    fun solution(x: Int): Boolean {
        var answer = true
        var x: Int = x
        var xs: Int = 0
        while(x > 0){
            xs += (x %10)
            x /= 10
            println(xs)
            println(x)
        }
        if (x % xs == 0) {
            answer = true
        } else {
            answer = false
        }
        return answer
}
}

 

 
테스트 3, 4 에서 결괏값이 다르게 나온다.
출력한 값은 맞게 나오는데 왜 false 로 나와야할게 true 로 나오는 걸까
IF 구문 넣기 전에 x 값이 10으로 몽땅 나눠서 0인 상태로 IF 구문에 들어가기 때문에 결괏값이 죄다 true 로나오고 3,4 만 실패
 
x 값을 받아오는 변수를 다른 이름으로 선언하니 제대로 나온다

class Solution {
    fun solution(x: Int): Boolean {
        var answer = true
        var a: Int = x
        var xs: Int = 0
        while(a > 0){
            xs += (a %10)
            a /= 10
        }
        if (x % xs == 0) answer = true else answer = false
        
        return answer
}
}

 
 
 
 
다른 사람 풀이

class Solution {
    fun solution(x: Int): Boolean {
        return x % x.toString().fold(0){acc, c -> acc + c.toInt() - 48} == 0
    }
}

 
 

inline fun <T, R> Iterable<T>.fold(
    initial: R,
    operation: (acc: R, T) -> R
): R
                           ▼누적값
 x % ( x.toString().fold(0){acc, c -> acc + c.toInt() - 48} ) == 0
                       ^초기값  ^순회중인 문자

 
fold 메소드는 배열, 리스트, 문자열 등과 같이 순회 가능한 자료형에 대하여 각 요소를 순회하면서 누적 연산을 수행한다
숫자 문자열을 정수로 변환할 때 숫자 문자열의 각 문자가 가지고 있는 아스키 코드를 통해서 정수값을 가져온다.
아스키 코드는 문자를 숫자로 표현하는 표준 인코딩 체계 중 하나로 
0부터 9까지의 값이 48부터 57이므로 각 값에서 48을 빼면 해당 문자를 나타내는 숫자를 얻을 수 있다.