※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[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은 하샤드 수가 아닙니다.
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문에서 처리하도록 설계하였다.