JSITCLUB

파이썬 - 프로그래머스 - 하샤드 수 본문

파이썬/문제풀이

파이썬 - 프로그래머스 - 하샤드 수

jsitclub 2020. 8. 5. 14:08

프로그래머스 level 1

문제 설명

양의 정수 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은 하샤드 수가 아닙니다.

 

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하�

programmers.co.kr

 

풀이 및 코드

문제 요약

각 자릿수를 합한 값으로 원래 수를 나누어 떨어지면 하샤드 수 

 

문제 해설

이 문제의 해결 알고리즘은 다음과 같습니다.

 

1. 주어진 수의 각자릿수 합을 구한다.

2. 구한 값으로 원래수를 나누어 준다.

 

즉 이 문제는 먼저 각 자릿수를 더할 수 있으면 쉽게 풀 수 있는 문제입니다.

숫자의 각 자릿수를 더하는 방법은 "자릿수 더하기"문제(https://jsitclub.tistory.com/59)에서 이미 설명이 되어 있으니 참고하시기 바랍니다.

 

 

1. 각 자릿수를 구하는 코드는 다음과 같습니다.

def solution(x):
    answer = True
    sum=0
    while x>0:
        sum+=(x%10)
        x//=10
    print(sum)

    return answer


solution(12)

코드를 구현할 때 위와 같이 중간중간 결과를 print를 사용하여 눈으로 직접 확인해 주는 것이 좋습니다. 가끔 자신의 결과를 맹신하고, 확인 없이 코드를 한참 진행하다가 잘못되어 그때까지 코드가 모두 잘못되는 경우가 있으니 중간중간 결과를 확인하는 습관을 갖는 것이 좋습니다.

 

또한 중간에 sum+=(x%10)과 x//=10와 같이 사용한 "복합 대입 연산자"는 반드시 사용해야 하는 것은 아니므로 각각  sum=sum+(x%10)과 x=x//10으로 사용해도 같은 의미입니다. 하지만, 다른 사람들의 코드를 읽거나 참고할 때가 종종 있으므로 읽고 이해는 할 수 있어야 합니다.

 

2. 합계로 원래수를 나누어 떨어지는지 여부를 추가해 함수를 완성하겠습니다.

 

결과코드 

def solution(x):
    n=x
    sum=0    
    while n>0:
        sum+=n%10
        n=n//10
    
    if x%sum==0:
        return True
    else:
        return False

위이 코드에서 x를 n에 넣어 n으로 계산한 이유는 1번의 코드를 그대로 사용하면 x는 0 이 되므로 합계가 나와도 처음 x값을 알 수 없어서 하샤드수 인지 판단할 수 없게 됩니다. 따라서 처음의 x값은 그대로 두고 n에 복사하여 n으로 진행했습니다.

 

 

정답확인

 

참고로  위 코드에서 마지막 부분이 참, 거짓 이므로 조건문을 안 쓰는 방법을 설명 하겠습니니다.

이 방법 역시 꼭 사용해야 하는 것은 아니지만(저 역시 별로 좋아하는 코딩 모습은 아니지만), 결과가 True/False로 나와야 할 때 가끔씩 이런 모습의 코드를 접하게 되는데, 그때 이해하는데 도움이 되길 바라며 적겠습니다.

 

이 전에 bool값을 공부할 때 파이썬에는 자료형의 기본값이 False이고 기본값이 아닌 나머지는  모두 True라고 이야기 했었습니다.(https://jsitclub.tistory.com/16때문에 2번 코드의 마지막 if문의 x%sum 이 0이 나오면 bool값으로 는 False이고, 그 나머지 값들은 bool값으로 True가 됩니다. 

 

하지만 문제에서는 x%sum 이 0이 나오면 True를 리턴하고, 나머지는 False를 리턴하라고 했습니다. 즉 반대 값을 리턴하라는 것이죠. 결국 이 내용을 코드에 반영하면 다음과 같이 표현할 수 있게 됩니다.

def solution(x):
    n=x
    sum=0    
    while n>0:
        sum+=n%10
        n=n//10
    
    return not(x%sum)

오늘도 수고하셨습니다.

Comments