jyamethyst21 님의 블로그

백준 17618번 - '신기한 수' (PYTHON 풀이) 본문

CODING 💻

백준 17618번 - '신기한 수' (PYTHON 풀이)

jyamethyst21 2026. 3. 21. 01:56

문제:

 

수를 입력받고 1부터 입력받은 수까지 순회하면서 각 자릿수를 전부 더했을 때, 입력받은 수의 약수라면 카운트해서 개수의 합을 출력하면 된다.

 

풀이:

n = int(input())
count = 0

for i in range(1, n + 1):
    digit_sum = sum(map(int, str(i)))
    if i % digit_sum == 0:
        count += 1

print(count)

1부터 입력값까지 반복문을 돈다.

입력받은 수는 숫자형이므로 순회를 할 수가 없다. 그래서 이를 문자열로 바꾼 다음 각 자릿수를 숫자형으로 변환하여 보다 쉽게 각 자릿수의 합을 구하기 위해 map 함수를 활용한다. map 함수는 map(함수, 반복 가능한 객체)로 사용하며 반복 가능한 객체를 함수형태로 변환한다. 그래서 문자열 형태인 i를 나눈 다음, 전부 숫자형으로 바꾼다. 그리고 sum 함수를 활용해 전부 더한다. 

예를 들어 i가 '172'라면 1,7,2로 찢어지고 더하면 10이 된다.

 

해당 문제는 1부터 입력받은 n까지를 전부 돌면서 계산을 해야하기 때문에 반복 횟수는 1부터 입력받은 수까지이다. 그래서 1부터 시작하는 i의 자릿수의 합을 앞서 말한 로직에 따라 계산해서 digit_sum에 저장하고 만약 이 수가 i의 약수일 경우(나눴을 때 나머지가 0인 경우는 딱 떨어졌다는 의미이므로 약수가 됨) count를 1 증가한다.

이후 반복문을 전부 돌고나면 count에는 문제 요구사항에 맞는 신기한 수 개수가 전부 더해져있으므로 이를 출력하면 된다.