코딩테스트 연습

[백준] 4673번 - 셀프 넘버 (PYTHON)

zzzin 2022. 12. 12. 00:06

이 문제는 조금 어려웠다.

일단 셀프넘버라는 걸 처음 들어봐서, 문제를 자세히 읽어야 했다.

 

문제

 

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램이다.

 

먼저, 첫 번째로 풀어본 방식은 다음과 같다.

import math

r_list = list(range(1, 10001)) # 1~10000까지의 숫자로 이루어진 리스트 생성
for i in range(1, 10001):
    lenght = len(str(i)) # 1~10000까지 각 숫자의 자릿수 추출
    tmp = i 
    for j in range(lenght):
        if j == 0: # 1의자리 수 더해주기
            tmp = tmp + i
        else:
            tmp = tmp + math.trunc((i / pow(10, j))) # 10의자리 수 이상 더해주기
    
    if tmp in r_list: 
        r_list.remove(tmp) # 셀프넘버가 아닌 것들을 전체숫자 리스트에서 제외해주기
        
print(*r_list, sep='\n') # 전체 리스트를 엔터값을 구분자로 해서 출력

1~10000까지의 모든 숫자를 담고 있는 리스트를 먼저 생성한 후, 셀프넘버가 아닌 값들을 제외시켜준다.

 

 

그리고, 두 번째 방식 풀이이다.

r_list = list(range(1, 10001))
for i in range(1, 10001):
    tmp_list = [int(k) for k in str(i)] # 자릿수로 나눠 담기 ex) [1, 2, 3]
    result = sum(tmp_list) + i # 원래숫자 + 모든 자릿수의 합
    if result in r_list: 
        r_list.remove(result)
print(*r_list, sep='\n')

1~10000까지의 수를 담은 리스트를 동일하게 생성해주고, tmp_list에 각 자릿수로 분리해서 담아준다.

그렇게 해서 구해진 셀프넘버가 아닌 수들을 동일하게 전체 리스트에서 제외해준다.

 

 

마지막으로, 세 번째 방식 풀이이다.

def d(n): # 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수 정의
    return n + sum(map(int, str(n)))

remove_list = list()
for i in range(1, 10001):
    remove_list.append(d(i)) # d(n) 함수로 리턴되는 값 입력
    
for i in range(1, 10001):
    if i not in remove_list: # d(n) 함수로 리턴되는 값 제외하고 출력
        print(i)

이 방식은 문제에서 주어진 d(n) 함수 자체를 선언해놓고, 이렇게 해서 리턴된 값을 제외하고 찍는 방식이다.

 

 


셀프 넘버라는 단어가 생소해서 조금 이해하는 데 시간이 걸렸지만, 비교적 어렵지는 않은 문제였다.(수포자 기준..ㅎ)