이 문제는 조금 어려웠다.
일단 셀프넘버라는 걸 처음 들어봐서, 문제를 자세히 읽어야 했다.
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) 함수 자체를 선언해놓고, 이렇게 해서 리턴된 값을 제외하고 찍는 방식이다.
셀프 넘버라는 단어가 생소해서 조금 이해하는 데 시간이 걸렸지만, 비교적 어렵지는 않은 문제였다.(수포자 기준..ㅎ)
'코딩테스트 연습' 카테고리의 다른 글
[백준] 11655번 - 아스키 코드 (PYTHON) (0) | 2022.12.12 |
---|---|
[백준] 1065번 - 한수 (PYTHON) (0) | 2022.12.12 |
[백준] 15596번 - 정수 N개의 합 (PYTHON) (0) | 2022.12.11 |
[백준] 8958번 - OX퀴즈 (JAVA) (0) | 2022.02.07 |
[백준] 4344번 - 평균은 넘겠지 (JAVA) (0) | 2022.02.07 |