백준 2231번 바로가기

나의 풀이

def generator(n):
  return int(n) + sum([int(i) for i in str(n)])

for i in range(n:=int(input())):
  if n == generator(i):
    print(i)
    break

else:
  print(0)

고수의 풀이

N=int(input())
r=0
for i in range(max(0, N-100), N):
 if sum(map(int,list(str(i))))+i==N:r=i;break
print(r)

출처

CODE REVIEW

  1. for문 안에서 체크하고 만약 break로 빠져나오는 것이 없으면 else로 넘어가 0을 프린트한다.
  2. 고수의 풀이도 논리는 동일하다.
    • 내 코드에서는 else로 예외 처리 해주었지만, ans=0으로 지정해주고 print(ans)를 for문 밖으로 꺼내도 되었다.
    • 3자리가 넘어가게 되면 작은 숫자들로는 애초에 생성자로 불가능하다. 따라서 range(max(0, n-100), n)와 같이 범위 설정해지면 불필요한 연산을 줄일 수 있다.

내 코드 수정…

def generator(n):
  return int(n) + sum([int(i) for i in str(n)])

ans=0

for i in range(n:=int(input())):
  if n == generator(i):
    ans = i
    break
    
print(0)