[백준] 2231: 분해합 - 파이썬[python]

다인·2024년 9월 1일

백준

목록 보기
49/112
post-thumbnail

내가 푼 코드는 걸리는 시간이 너무 길어서 줄일 수 있을 것 같아 찾아봤더니 중간에 break하면 되더랑

1. 내 코드

N = int(input())
result = 1000001

for i in range(1, N):
    num = list(map(int, str(i)))
    sum = i
    for j in range(len(num)):
        sum += num[j]
    if sum == N:
        result = min(result, i)

if result == 1000001:
    print(0)
else:
    print(result)
  • 우선 나는 i의 분해합을 구하기 위해 리스트로 바꾸고 for문을 돌면서 각 자리의 수를 더했다.
  • 가장 작은 생성자를 구하기 위해 여러 개 중 min을 구했다.
  • N이 1000000까지 가능하기 때문에 result를 1000001으로 넣었고 얘가 바뀌지 않으면 생성자가 없는 걸로 판단했다.

2. 개선된 코드

N = int(input())
result = 0

for i in range(1, N):
    num = sum(map(int, str(i)))
    num += i
    if num == N:
        result = i
        break

print(result)
  • i의 분해합을 for문을 사용하지 않고, 그냥 바로 map을 통해 더했다.
    혹은 다음을 통해서도 각 자리의 합을 구할 수 있다!
sum(int(x) for x in str(i))
  • 분해합이 N과 같은 순간이 애초에 가장 작은 생성자이기 때문에 바로 break를 하고 for문을 끝내버린다.
  • 생성자가 없다면 result가 바뀌지 않아서 0이 출력될 것이고, 있다면 가장 작은 생성자가 출력될 것이다.

🤔 또 다른 코드

N = int(input())

for i in range(1, N+1):
    num = sum(map(int, str(i)))
    num += i
    if num == N:
        print(i)
        break

if i == N:
    print(0)
  • 구글링하면 가장 많이 보이는 코드가 이거다. 위에는 이걸 바탕으로 내가 작성했던 것이구.
  • 그런데 여기서 엄청난 실수를 했다! 처음에 range를 N까지로 했더니 틀렸습니다가 나온 거다.. N은 어차피 생성자가 될 수 없어서 일부러 그렇게 한 건데, 뭐 그거랑 상관없이 i == N랑 연결돼서 틀렸습니다가 뜬 걸 거다.
  • 뭐지뭐지 하며 단순한 for문을 출력해보니... 허거덩 range(3)이면 i는 2까지만 증가한다.. 나는 다른 언어처럼 계속 +1하다가 range(n)의 n을 넘어서면 for문이 끝난다고 생각했는데 아니었다!!!!! 개충격!!!!ㄴㅇㄱ
  • 그래서 range(N)을 할 거면 i == N-1을 했었어야 했다.

결론

차례대로 여기서 작성한 코드에 대한 결과이다.

0개의 댓글