새소식

백준 알고리즘

[백준 알고리즘] #4673번 - 셀프넘버 with Python

  • -

💡문제 설명 

🙆🏻‍♀️ How I solve

33 -> 33 + 3 + 3 = 39 -> 33은 39의 생성자
1 -> 1 + 0 + 1 = 2 -> 1은 2의 생성자
1,3,5...을 만들어주는 숫자는 없다 ->  셀프넘버

1에서부터 시작하여 01 + 0 + 1 = 2, 02 + 0 +2 =4 이런식으로

생성자의 값을 하나씩 늘려가면서 생성자가 있는 숫자들을 찾을 수 있다. 

내가 생각한 방법은 배열에 1부터 10000까지의 숫자를 넣고, 생성자를 하나씩 늘려가면서 생성자가 있는 숫자들을 리스트에서 제거하는 것이였다. 

 

result = []

for i in range(10000):
    result.append(i)
# a가 9972이면 9999
for i in range(9973):
    sum = 0
    if i < 10:
        sum = i + i
        result.remove(sum)
    elif 9 < i < 100:
        sum = i + (i//10)%10 + (i % 10)
        result.remove(sum)

    elif 99<i<1000:
        sum = i + (i//100) % 10 + (i//10) % 10 + (i % 10)
        if sum in result: 
            result.remove(sum)
        else: //배열에 이미 다른 생성자가 값을 제거하였을 때
            continue

    elif 999<i<10000:
        sum = i + (i//1000)%10 + (i//100)%10 + (i//10) % 10 + (i % 10)
        if sum in result:
            result.remove(sum)
        else: //배열에 이미 다른 생성자가 값을 제거하였을 때
            continue

for i in result:
    print(i)

 

 

 

🙆🏻‍♀️ How to solve

위에 코드보다 간단하게 풀 수 있다.

 

먼저 numbers에 10000까지의 값 저장

1부터 반복문을 돌리고 문자열 자리수마다 쪼개어 num과 각 자리수의 합을 num으로 갱신

이 값이 10000보다 작거나 같으면  만들어놓은 remove_list에 추가

set을 이용해 numbers에 저장해놓은 1부터 10000까지의 값과 remove_list에서 중복되는 값 삭제- 차집합

 

코드를 간결하게 하기 위해 str()의 사용과 set을 사용하였다.

numbers = list(range(1, 10001))
remove_list = []  # 이후에 삭제할 숫자 list
for num in numbers :
    for n in str(num):
        num += int(n)  # 생성자가 있는 숫자
    if num <= 10000:  # 10,000보다 작거나 같을 때만,
        remove_list.append(num)  # append: 리스트에 요소를 추가할 때

for remove_num in set(remove_list) :  # set 으로 중복값 제거
    numbers.remove(remove_num)
for self_num in numbers :  # 생성자가 있는 숫자를 삭제한 리스트
    print(self_num)
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.