본문 바로가기
프로그래밍/알고리즘

백준 2331 - 분해합 파이썬

by monicada 2022. 12. 2.
728x90

우테코를 같이 지원했던 사람들끼리 슬랙에서 만나 스터디를 꾸렸다

평일 오전 9-12시 동안 게더타운에서 모각코를 진행할 예정이다 

확실히 혼자하는 것보다 더 집중하게 된다는 점에서 하기 잘했다 

 

문제 

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

나의 풀이 

#입력 값(n) 받기 
n = int(input())
#결과를 담을 변수 생성 
result = 0
#for 문으로 1부터 N까지의 모든 수를 계산하보며 분해합을 구함 
#range의 범위가 (n+1)이유는 하나 전 까지 받기 때문에 범위가 (1, N+1)이 된다
for i in range(1, n+1):
    nums = list(map(int, str(i)))
    result = sum(nums) + i
    if result == n:
        print(i)
        break
    #값이 없을 경우, 분해대상 == 생성자인 경우
    if i == n:
        #0을 출력 
        print(0)

내가 본 좋은 코드 

N = int(input())
x = 0
for i in range(N):
    a = list(map(int, str(i)))
    if N == sum(a) + i:
        x = i
        break;
print(x)

정수의 각 자릿수를 리스트로 받기 위해서는 map()함수를 활용해야 한다 

문자열을 입력받아야 하므로 str()로 형변환을 한 후 map()함수로 각 자릿수 값을 int로 형변환한다 

만약, 216을 입력받았다면 리스트 (위의 코드 기준)nums에 [2,1,6]을 담을 수 있다 

 

답을 찾는 부분은 'result = sum(nums) + i'인 상태가 생성자를 찾은 시점이므로 이럴 때, 반복문을 탈출하여 값을 출력한다 

만약, n까지 진행된다면 생성자가 없는 것으로 '0'을 출력한다 

 

댓글