Algorithm Study/Python

[백준 파이썬] # 2231 분해합

728x90
반응형

 

Bronze II

# 2231 분해합

브루트 포스

 

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

 

 

2231번: 분해합

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

www.acmicpc.net

 

 

풀이

N = int(input())
li = []

# 출력값이 N보다는 작은 값이라는 가정하에 모든 경우의 수 확인

for i in range(N):
    s = 0                    # for문이 돌 때마다 s를 갱신해야 함
    s += i 
    for j in str(i):
        s += int(j)
    if s == N:
        li.append(i)

if li == []:
    print(0)
else:
    print(min(li))

 

  • 런타임 오류가 나올 때는 문제를 다시 읽어보고 예외처리가 필요한지 확인해보자
  • s=0 의 위치를 for 문 바깥에 작성해서 문제 해결하는데 어려움을 겪었다. for 문이 반복될 때마다 갱신해줘야 하는 변수들이 무엇인지 잘 살펴보도록 하자
  • 리스트 공간 li가 비어있을 경우를 조건문으로 어떻게 처리해야하는지 의문스럽다
    • li == [] 를 사용했을 때 test time : 0.764..
    • len(li) == 0 를 사용했을 때 test time : 0.954..
    • li is False 를 사용했을 때 test time : 2.056..
    • not li 적용 시 2.78..
    cf. time 측정 시 li == [] 가 가장 짧은 시간을 기록해서 그대로 사용하려 했으나, 권장되는 사용 방법은 아니라고 한다 (이유에 대해서는 명쾌한 답을 얻지 못했다)

    → if not li 혹은 li is False 을 사용하도록 하자