백준_셀프넘버

임정민·2024년 2월 28일
0

알고리즘 문제풀이

목록 보기
166/173
post-thumbnail

백준 실버5 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://www.acmicpc.net/problem/4673

[나의 풀이]

⌛ 14분


def generator(x):

    v = x+sum(list(map(int,str(x))))
    
    return v

tmp = [i for i in range(10001)]
ans = set()

for x in tmp:
    ans.add(generator(x))

self_num = list(set(tmp)-ans)
self_num.sort()

for num in self_num:
    print(num)

1~10000 사이의 셀프 넘버를 구하는 문제입니다.

양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의 할 때, n을 d(n)의 생성자라고 정의합니다.

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있습니다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

이때, 생성자가 없는 숫자를 '셀프 넘버'라고 하며 10000보다 작거나 같은 셀프 넘버를 출력하는 문제입니다.

전체 숫자 리스트(tmp)와 생성자가 있는 숫자 리스트(ans)를 Set() 구조로 구현하고 연산하였습니다. 이후 list 객체로 정렬하여 해결하였습니다.

[다른 사람의 풀이1]

def d(n):
    num = list(str(n))
    asw = n
    for i in range(len(num)):
        asw += int(num[i])
    return asw

SET = list(range(1,10001))
for n in range(1,10001):
    if d(n) in SET:
        SET.remove(d(n))
    
for i in range(len(SET)):
    print(SET[i])

'나의 풀이'와 다르게 모든 범위의 숫자가 포함된(1~10000) list 객체에서 생성자가 발생하였을 때마다 하나씩 remove()해주는 방식입니다.

[다른 사람의 풀이2]

nature_num = set(range(1,10001))
numList = set()

for i in nature_num:
    for j in str(i):
        i += int(j)
    numList.add(i)
    
self_num = sorted(nature_num - numList)
# print(type(self_num)) #list
for i in self_num:
    print(i)

'나의 풀이'처럼 Set() 구조를 활용한 풀이입니다.

전체 숫자 리스트(nature_num)에서 생성자인 숫자 리스트(numList)를 뺄셈했다는 점은 동일하지만

연산한 객체를 바로 sorted()함으로써 list 객체 따로 형변환을 진행하지 않아도 되는 점이 달랐습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글