TIL ~ 24.04.05

하샤드 수

wlsds00_ 2023. 12. 18. 09:51

21. 하샤드 수

class Solution {
    fun solution(x: Int): Boolean {
        var answer = true
        var sum = 0

        x.toString().map {
            sum += (it.toInt() - '0'.toInt())
        }
        return x % sum == 0
    }
}

 

x를 우선 문자열로 변환하는데 이때 map을 쓰면 각 자릿수별로 변환이 된다.

예제에 있는 10의 경우 1, 0 으로 나오고 11의 경우 1, 1 이런식으로? 그 값에서 0을 뺀 뒤 다시 Int로 변환한다.

변환된 값은 더해져서 10의 경우 1, 11의 경우 2 이런 형태로 sum에 저장된다. 

return에서 x는 sum값으로 나머지를 구해서 0과 같으면 true, 나머지가 있으면 false로 반환된다.

 

아래는 다른 분들의 풀이 중 하나를 가져온 것이다.

class Solution {
    fun solution(x: Int): Boolean {
        var sum = 0
        var num = x

        while (num > 0) {
            sum += num % 10
            num /= 10
        }

        return (x % sum == 0)
    }
}

 

사실 이 코드가 어떻게 돌아가는지 완전히 이해를 못해서 중간의 num을 10으로 나누는 줄을 지워봤는데 실행시간 초과가 나왔다. chat GPT에게 질문해봤더니 아래같은 대답이 나왔다.

 

num /= 10은 현재의 num에서 마지막 자릿수를 제거하는 연산입니다. 이 연산은 num을 10으로 나눈 몫으로 num을 갱신합니다. 여기서 몫은 소수 부분을 버린 결과가 됩니다.

예를 들어, num이 123이라면, num /= 10 연산 후에 num은 12가 됩니다. 이는 123을 10으로 나눈 몫이기 때문입니다. 이 과정을 반복하면서 num은 각 단계에서 현재의 마지막 자릿수를 잃어나가게 됩니다.

코드에서 while (num > 0) 루프는 num이 0보다 큰 동안 계속 실행되며, 각 반복에서는 num의 마지막 자릿수를 sum에 더하고, 그 다음에는 해당 자릿수를 num에서 제거합니다. 이 과정은 num이 0이 될 때까지 반복됩니다.

이렇게 하면 sum에는 원래 숫자 x의 각 자릿수의 합이 누적되고, 동시에 num은 0이 됩니다. 이후에는 return (x % sum == 0) 부분에서 원래 숫자 x가 자릿수의 합으로 나누어 떨어지는지 확인하고 결과를 반환합니다.

 

처음에는 자릿수를 분리해서 더하는 방법을 모르겠어서 당황했었는데 다른분들의 풀이를 보다보니 위처럼 풀수있는 경우도 있다는걸 알았다. 자릿수를 꼭 직접적으로 분리해야 한다고만 생각해서 힘들었는데 생각이 너무 그쪽으로만 가서 오히려 더 어렵게 느껴졌던것 같다. 기본적으로 코드카타는 수학문제 풀이기도 하다는걸 생각해야겠다.

'TIL ~ 24.04.05' 카테고리의 다른 글

두 정수 사이의 합  (0) 2023.12.19
20231218 TIL  (0) 2023.12.18
20231215 TIL  (0) 2023.12.15
20231214 TIL  (0) 2023.12.14
정수 내림차순으로 배치하기  (0) 2023.12.14