알고리즘

백준 알고리즘(파이썬) - 2231번

joy_lee 2021. 8. 23. 21:44

분해합 구하기

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

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

www.acmicpc.net

분해합을 구하는 것은 작성할 수 있겠는데 생성자는 어떻게 해야할지 막막했다. 어떤 범위의 수들을 확인해야할지 감이 오지 않아서 검색을 통해 코드를 작성했다.

 

1
2
3
4
5
6
7
8
9
10
= int(input())
result = 0
for i in range(1, N+1):
    A = list(map(intstr(i)))
    result = i + sum(A)
    if result == N:
        print(i)
        break
    if i == N:
        print(0)
cs

답을 찾아보니 매우 간단했다.

나는 큰 수를 입력받을 수 있어서(<=1,000,000) 범위를 정해줘야 된다고 생각했는데, range(1, N+1)로 입력받은 수 까지 확인해도 2초라는 시간제한에 걸리지 않고 출력이 가능한 모양이다.

1부터 N(입력받은 수)까지의 수를 모두 확인하는데, 각 자리수를 따로 분리해 A라는 list안에 넣는다.

각 자리수를 합한 것과, 그 수를 더해서 N과 같으면 그 수를 출력하고, for 문을 중지한다.

끝까지 확인했는데 나오지 않으면 생성자가 없는 경우이다. 그런 경우에는 0을 출력한다.

 

처음부터 범위에 대해 고민하지 말고, 알고리즘을 먼저 작성해보는게 좋을 것 같다. 속도가 충분히 나와준다면 굳이 제한할 필요가 없다.