※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[Programmers]사이트에 발췌해왔습니다.

💬 들어가기 앞서..

💢 하샤드 수 란?

"하샤드 수 (harshad number) , "니번 수" 라고도 불리우는 수이다.

하샤드 수 는 (주어진 진법 에서) 그 수의 "각 자릿수 숫자의 합" 으로 그 수가 "나누어지는 양의 정수" 를 말한다.
이 말은 즉슨 하샤드 수의 정의가
"자기자신각 자리숫자의 합의 몇 배가 되어서 약수와 배수의 관계가 되는 수" 를 일컫는 말이다.

▶ ( 0진법의 밑 사이 ) 모든 정수 : 하샤드 수

참고로,
두 자리 이상의 모든 소수는 하샤드 수가 아니다.
왜냐하면 소수의 정의는 "1보다 큰 양의 정수 중 " 에서
"1자기자신 이외의 수"로 나누어떨어지지 않는 성질 → 1과 자기자신만을 약수로 가질 수 있는 수
But,
[각 자리숫자의 합]은 1보다 크고, 자기자신보다 작아서 나누어떨어지지 않기 때문이다.



💡 무조건 하샤드 수가 되는 경우 💡

  • 10의 거듭제곱인 수 (각 자리의 합이 1이기 때문)

  • 1 이상한 자리 수

  • 다른 하샤드 수10의 거듭제곱인 수를 "곱한" 숫자들

  • 각 자리의 합3이나 9가 되는 수

  • 6, 18이면서 짝수인 수

  • 일의 자리0이고 일의 자리를 제외한 각 자리의 합5의 배수가 되는 수

  • 일의 자리0, 5, 8이고 일의 자리를 제외한 각 자리의 합10이 되는 수

  • (그 외 해당되는 숫자에서) "각 자리의 합으로 나누어 떨어지는 수" (가장 기본적인 정의)

  • (세 자리수인 경우) 십의 자리0이고 백의 자리 + 십의 자리11인 수

  • 모든 자리같은 숫자로 되어있고 자릿수3의 거듭제곱인 수
    (ex. 111, 222, 333, 999999999, 111111111111111111111111111 등등)

❗ 10진법에서 모든 1 이상의 한 자리 수는 모두 하샤드 수
( 1, 2, 4, 6 은 유일하게 어떤 진수에서든 하샤드 수.)


※ 출처 ㅣ 위키백과_ 하샤드 수


❓ 문제

양의 정수 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입니다. 
 3은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

❗ 풀이

My Code

def solution(x):
    result = x%sum([int(num) for num in str(x)])
    if (result == 0) :
        answer = True
    else :
        answer = False
    return answer

우선 입력된 숫자 값을 str()함수를 통해 "문자열" 로 바꾸어
각 자리 수를 분리할 수 있게끔 한 후,
For문을 통해 자릿수 하나씩 가져와 int()함수로 "숫자형" 으로 변환하여 "한 자리 숫자"로 구성하는 리스트를 만들어 준다.

그 다음,
sum()함수를 통해 리스트를 구성하는 숫자들의 을 만들어준다.
마지막으로
이 합을 입력값과 나눈 나머지 값을 구하여
0일 경우에는 하샤드 수이기 때문에 True 값을 부여하고
아닐 경우에는 False값을 부여한다.

부여한 Bool값을 리턴하여 함수를 마무리한다.


❣ 다른 풀이

(1)

def Harshad(n):
    return n % sum([int(c) for c in str(n)]) == 0

계산 방법과 구조는 위와 동일하지만
이전 알고리즘 게시물에 올렸었던 내용으로
별도로 *Bool값을 주지 않고 return에서 계산하여 참/거짓을 분류하는 형식이다.

훨씬 깔끔한 방법이다.


(2)

def Harshad(n):
    st = str(n)
    a = 0
    for i in range(len(st)):
        a += int(st[i])

    return True if n%a == 0 else False

입력값을 문자열로 바꾸어 새로운 변수로 선언하고
0 값을 a라는 변수에 선언을 먼저 한다.

그 후,
for문을 통해 "문자열의 길이"로 *인덱싱하여 꺼냄과 동시에
0(a)에 누적합 시키는 방법으로 계산하였으며

True/False는 Return문에서 처리하도록 설계하였다.

0개의 댓글