[알고리즘] 백준 2231 : 분해합 - B2

eternal moment·2023년 4월 26일
0

2023.04.26 풀이

n = int(input())

for i in range(1, n+1):   # 해당 분해합의 생성자 찾기
    num = sum((map(int, str(i))))  # i의 각 자릿수를 더함
    num_sum = i + num  # 분해합 = 생성자 + 각 자릿수의 합
    # i가 작은 수부터 차례로 들어가므로 처음으로 분해합과 입력값이 같을때가 가장 작은 생성자를 가짐
    if num_sum == n:
        print(i)
        break
    if i == n:  # 생성자 i와 입력값이 같다는 것은 생성자가 없다는 뜻
        print(0)

2023.05.18 풀이

import sys
input=sys.stdin.readline

n=int(input())
res=0

for i in range(1, n+1):
    sum=0
    k=i
    for j in range(len(str(i))):
        sum+=k%10
        k//=10
    if sum+i==n:
        res=i
        break

print(res)

2023.11.07 풀이

import sys
input=sys.stdin.readline

n=int(input())
i=1
k=0
while True:
    k=sum(list(map(int, str(i))))
    print(i, k, i+k)
    if i+k==n:
        print(i)
        break
    elif i+k>n:   #수정->elif i+k==n:
        print(0)
        break
    i+=1

가장 먼저 위와 같이 풀었는데, 이 경우 15 와 같은 경우가 틀리게 됨.
7+7=14, 8+8=16에서 15보다 커지므로 반복문이 종료되는데, 12+1+2 ==15 인 경우가 있으므로 n까지 반복문을 돌려줘야함. elif i+k==n: 로 수정하면 맞음.

다른 풀이

def find():
    a = int(input())
    for n in range(1, a):
        if n+sum(map(int, list(str(n)))) == a:
            return n
    
    return 0

print(find())

num = int(input())
n_lst = []
rng = num - 9*len(str(num))
if rng < 1 : rng = 1
ans = 0
for i in range(rng,num) :
    m_num = i + sum(map(int,str(i)))
    if m_num == num : 
        ans = i
        break
print(ans)

check point

  • 1부터 n까지 모든 경우의 수 판단, 되는 경우 있으면 멈추고, 되는 경우가 없어서 n까지 돌게 되면 0 출력
    되는 경우는 생성자인 i를 분해합해보기

0개의 댓글