본문 바로가기
IT/알고리즘

[백준] 4673 셀프 넘버

by 랑_랑 2022. 1. 11.
300x250

생성자가 없는 숫자를 구하는 문제이다.

정확히 11개월 전 풀었었는데 다시 풀려고하니 기억이 잘 나지 않아 힘들었다.

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

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

self_num = list(range(1,10000))

for i in range(1, 10000):
    if i < 10 and i*2 < 20:
        self_num.remove(i*2)
    elif 10 <= i < 100:
        not_self_num = i+int(str(i)[0])+int(str(i)[1])
        if not_self_num in self_num:
            self_num.remove(not_self_num)
        else:
            pass
    elif 100 <= i < 1000:
        not_self_num = i+int(str(i)[0])+int(str(i)[1])+int(str(i)[2])
        if not_self_num in self_num:
            self_num.remove(not_self_num)
        else:
            pass
    elif 1000 <= i < 10000:
        not_self_num = i+int(str(i)[0])+int(str(i)[1])+int(str(i)[2])+int(str(i)[3])
        if not_self_num in self_num:
            self_num.remove(not_self_num)
        else:
            pass

for i in self_num:
    print(i)

내가 푼 방식은 숫자를 자리수 구간으로 나누고 str으로 변환 후 인덱스로 숫자를 나누어 다시 int형으로 변환하여 더해주는 방식이었다.

 

이전에 어떻게 풀었나 보니까 정말 대충 풀었었구나 하는 생각이 들었다.

a = list(map(int,range(1,10001)))
b = list(a)
def d(n):
    n = str(n)
    c = 0
    for i in range(len(n)):
        c += int(n[i])
    c += int(n)
    return c
e = 0
for i in range(1, len(a)):
    e = d(i)
    if e in b:
        b.remove(d(i))

for i in range(len(b)):
    print(b[i])

쓰는것도 귀찮아서 a, b, c, d, e로 해둔걸 보니 참.. 가지가지 했구나 싶다.

 

예전에는 더 편하게 풀었던 것 같다. 함수화하여 리턴해주는 방식으로 풀었으며 결국 같은 방법이지만 조금 더 깔끔한 것 같다.

 

 나는 당장의 실력에 부끄러워하거나 스스로를 폄하하는 것 보다는 1년이 지난 후에 퇴보해 있는것이 부끄러운 것이라고 생각한다. 11개월 전의 내가 푼 아주 간단한 문제도 제대로 못 푸는 것을 보니 손을 오래 놓은 티가 난다. 1년 뒤에는 부끄럽지 않을 수 있도록 노력해야겠다.

728x90

'IT > 알고리즘' 카테고리의 다른 글

[백준] 2869 달팽이는 올라가고 싶다.  (0) 2022.01.13
[백준] 1712 손익분기점  (0) 2022.01.13
[백준] 1152 단어의 개수  (0) 2022.01.13
[백준] 4344 평균은 넘겠지  (0) 2022.01.11
[백준] 4153 직각삼각형 파이썬  (0) 2022.01.10

댓글