본문 바로가기
DEV/알고리즘 문제 풀이

[백준] 4673번 with Python

by krokerdile 2021. 6. 16.

주말에도 풀다가 문제에 대한 이해가 안되서 미뤄두었던 문제임. 일단 이해가 안된 이유는 문제의 시작을 어디서 부터 집어서 풀어야 될지가 감이 안잡혀서 더 그랬던 것 같음. 

4673번

처음 문제를 보았을 때 예시를 보고 감이 안잡혀서 이것 저것 시도를 다해보다가 직접 적어보면서 다시 풀어봤더니 그냥 너무 어렵게 생각했던 것 같음. 항상 백준 문제를 풀 때 느끼는 거지만 너무 어렵게 생각해서 쉬운 문제를 못풀게 되는 경우가 많은 것 같음. 다시 쉽게 생각해서 그냥 1부터 다 더해보고 셀프 넘버가 아닌거를 1~10000까지 가지고 있는 리스트 상에서 다 빼버리면 되는 거 였음. 

import sys
input = sys.stdin.readline
# 이걸로 일단 선언 해두기
# selfnum을 구해주는 함수 구해서 리스트 반환해주기
def sum_digit(number):
    return sum(map(int, str(number)))

def self_num(a):
    t = a+sum_digit(a)
    return t
r = []
for i in range(0,10000):
    r.append(i)

t = 0
while(t != 10001):
    t += 1
    ans = self_num(t)
    if ans < 10000:
        # print(ans)
        r[ans] = -1
    else:
        continue
for i in r:
    if i != -1 and i != 0:
        print(i)

답으로 맞춘 코드를 다시보면서 리뷰를 해보면, 가장 큰 문제는 이 문제가 결국 10000까지 참조를 한다는 점과 내가 만들었던 리스트 자체가 0 부터 시작을 한다는 점이었음. 답을 맞추기 위해서 마지막에 if i != -1 and i !=0 이라는 조건을 추가 해주기는 했지만, 애초에 만들 때 1부터 리스트를 만들면 되는 거 였고, 그리고 self_num 이라는 함수를 만들 때 함수의 기능을 잘못 만들었던 것이 처음에는 1로 시작해서 10001 보다 작은 셀프 넘버가 아닌 수를 다빼주면 되겠지라고 생각을 했어서 self_num의 인자 a로 인해 1~10001 사이에 만들어지는 셀프넘버가 아닌 리스트를 다 뺴줄려고 했지만, 결국 그냥 1~10000 까지의 숫자를 넣어줘서 만들어주는 것과 동일한 결과를 가져오는 거라서, 계산을 두 번하는 짓만 되었는 걸 알아서 위의 코드로 간략해졌다는 점.