이 문제를 일반적으로 풀어보고, 리스트 컴프리헨션으로 더 파이썬스럽게 수정하고, 마지막으로 제너레이터 표현식을 사용하여 더 간결한 코드로 만들어보겠습니다.
1. 일반코드
N = int(input())
for i in range(1, N+1):
digits = []
num = i
while num > 0:
digits.append(num % 10)
num //= 10
digits.reverse()
if i + sum(digits) == N:
print(i)
break
else:
print(0)
1. i는 숫자이기 때문에 for문에서 구역 설정을 (1, N+1)로 했습니다.
2. i가 루프의 변수라서 변경하면 이상한 값이 나올 수 있기에 num = i로 만들었습니다.
3. digits 라는 리스트에 각 자릿수로 num을 저장합니다. 이 과정에서 num은 나눗셈 대입 연산자를 사용하여 한 자리씩 숫자가 줄어듭니다.
4. digits 리스트에 각 자릿수가 작은 순으로 정렬되어 있으므로 reverse로 재배열합니다.
5. if 문으로 맞는지 확인하고 맞으면 출력하고 break 합니다. 아닐 경우 for-else문을 사용해서 else 블록을 실행시킵니다.
2. 리스트 컴프리헨션을 사용한 코드
N = int(input())
for i in range(1, N+1):
digits = [int(d) for d in str(i)]
if i + sum(digits) == N:
print(i)
break
else:
print(0)
1. digits라는 리스트에 i를 자릿수별로 넣습니다. 이 과정에서 i를 문자열로 바꾸는데 문자열을 iterable한 객체이기 때문입니다. 마지막에는 다시 int로 변경합니다.
3. 제너레이터 표현식을 사용한 코드
N = int(input())
for i in range(1, N+1):
digits_sum = sum(int(digits) for digits in str(i))
if digits_sum + i == N:
print(i)
break
else:
print(0)