[Python] 분해합 - 브루트포스

Saemi Min·2023년 3월 7일
0

BaekJoon

목록 보기
23/30
post-thumbnail

브론즈2

문제 2231

해당 문제 링크

내 풀이

정답이긴 하지만 시간을 너무 많이 소비했다.. 완전 탐색 문제라 시간이 널널하게 주었지만 그럼에도 너무 많이 낭비되었다. 완전탐색이어도 더 보기 쉽고 짜임새 있게 구현하는 것이 중요하다는 것을 다시 깨달았다!

n=input()
l=len(n)

i=1
n=int(n)

while n!=i:
    res=[]

    i=str(i)
    x=len(i)
    for k in range(x):
        res.append(int(i[k]))


    i=int(i)
    res.append(i)

    if sum(res) == n:
        print(i)
        break    
    i+=1
if(n==i):
    print(0)

다른 사람 풀이 1

내가 풀고자 접근했던 방식과 비슷하다.
이렇게 작성했으면 좀 더 빠른 시간에 풀렸을 것이다.

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)

다른 사람 풀이 2

가장 빠른 속도로 풀리는 코드이다.
왜 이렇게 작성했는지는 이해하지 못했다.ㅠㅠ 시간이 지나면 이해하는 날이 다가오길...

N=input()
k=len(N)
N=int(N)
if N>=9*k:
    for i in range(N-9*k,N+1):
        n = i
        p = str(i)
        for j in range(0, len(p)):
            n += int(p[j])
        if n==N:
            print(i)
            quit()
else:
    for i in range(0,N+1):
        n = i
        p = str(i)
        for j in range(0, len(p)):
            n += int(p[j])
        if n==N:
            print(i)
            quit()
print(0)
profile
I believe in myself.

0개의 댓글