유니 코드

[PGS/프로그래머스][Lv1] 하샤드 수(Kotlin) 본문

알고리즘/미분류

[PGS/프로그래머스][Lv1] 하샤드 수(Kotlin)

꼬물쥰 2022. 5. 10. 21:30

[문제 설명]

 

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

[제한 조건]

  • x는 1 이상, 10000 이하인 정수입니다.

 

[입출력 예]

arr return
10 true
12 true
11 false
13 false

 

[입출력 예 설명]

입출력 예 #1
10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.

입출력 예 #2
12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.

입출력 예 #3
11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.

입출력 예 #4
13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

 

[풀이]

 

1) 입력받은 숫자의 각 자리수 더하기

2) 입력받은 수에서 더한 값으로 나눠서 반환값 결정

 

각 자리 수를 더할 때 보통 반복문을 이용해 10으로 나누면서 더하기도 하지만

아래 코드와 같이 숫자를 문자열로 바꿔준 뒤 map으로 아스키 코드 값으로 치환한 후 sum을 이용하여 값을 구할수도 있다.

 

풀이를 완료하고 다른사람의 풀이를 봤다. 역시 놀라웠다..

어떤 문제든 한 줄로 푸는 사람은 항상 존재했다..

 

- 오늘의 깨달음

1. return 값으로 표현식을 사용할 수 있다는 점

2. fold함수

 : 초기값을 설정해주고 왼쪽부터 오른쪽까지 현재의 계산값에 각각을 적용하는 함수로 배열에서 사용하는 함수

 

 

[코드1]

class Solution {
    fun solution(x: Int): Boolean {
        var total = 0
        total = x.toString().map {
            it.toInt() - '0'.toInt()
        }.sum()
        
        if(x % total == 0) return true
        else return false
    }
}

 

[코드2]

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