[BOJ] 2231 | 분해합

밤초록·2021년 7월 7일
0

PS

목록 보기
10/13

2231 | 분해합
https://www.acmicpc.net/problem/2231

내 코드

N = int(input())

ex = False

for i in range(1, N+1):
    indiv = []
    indiv.append(i)
    i = str(i)
    for j in i:
        indiv.append(int(j))
    if sum(indiv) == N:
        print(i)
        ex = True
        break

if ex == False:
    print(0)

N = int(input())

tag = False

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

if not tag:
    print(0)

이상코드

N: int = int(input())

tag: bool = False

# 각 자리에서 가질 수 있는 가장 큰 값은 9
# 수 + 수의 각 자리 합 = 분해합이므로 
# 가장 작은 수(범위를 지정할)는 분해합 - 수의 각 자리 합의 최대값
# 즉 N-9*6
for i in range(max(1, N-54), N+1):
    if i + sum(map(int, list(str(i)))) == N:
        print(i)
        tag = True
        break
    # i == N
    # -> 끝까지 갔다는 것, 즉 분해합이 존재하지 않음
    elif i == N:
        print(0)

학습

  • 조건을 잘 생각해보면 별다른 변수 없이 풀 수 있는 문제였음

  • for 문 안에서 조건문 2개 돌리는 것보다 bool 형 변수 하나 선언하는 게 더 효율적일 것 같음

  • 범위를 지정할 때 시작 값을 max(1, N-54)로 지정한 것이 시간을 약 20배 단축 시켰음

  • 최대한 검색할 범위를 좁히되 모든 선택지를 포함할 수 있게끔 해야함

0개의 댓글