https://www.acmicpc.net/problem/4673
# 4673 셀프 넘버
numbers = list(range(1,10001))
remove_list = []
for num in numbers :
for n in str(num) :
num += int(n)
if num <= 10000:
remove_list.append(num)
for remove_num in set(remove_list) :
numbers.remove(remove_num)
for self_num in numbers :
print(self_num)
우선, 변수 numbers에 1부터 10,000을 리스트로 저장한다. remove_list는 생성자가 있는 수들을 저장할 리스트이며 나중에 numbers에서 제거해 줄 용도이다. 지금은 빈 배열로 둔다.
1~10,000이 저장되어 있는 리스트에서 숫자를 1개씩 꺼내서 각 자릿수를 분리하고 더한 수를 remove_list에 더해준다. 여기서 if문으로 10,000 이하라는 조건을 둔 이유는 나중에 아래에서 numvers 리스트에서 remove_list에 저장되어 있는 값들을 제거할 때 numbers에는 최댓값이 10,000이기에 이보다 큰 수가 있으면 오류가 발생한다.
위에 for문을 반복하면서 remove_list에 저장된 값들 중에서 중복된 값을 제거하기 위해 set() 함수를 썼고, numbers에서 제거해 준다.
마지막으로, 셀프 넘버를 한 개씩 출력해 준다.
아래는 생성자가 있는 수들을 저장할 것으로 set() 을 사용하였다.
numbers = set(range(1,10001))
remove_set = set()
for num in numbers :
for n in str(num) :
num += int(n)
remove_set.add(num)
self_numbers = numbers - remove_set
for self_num in sorted(self_numbers) :
print(self_num)
위와 유사하기에 달라진 부분만 설명하자면, remove_set은 append() 대신 add() 함수를 사용하고 셀프 넘버를 구할 때 remove() 대신 차집합 연산을 사용하기에 if문에 10,000 이하라는 조건이 필요 없다.
마지막에 sorted() 함수를 사용한 이유는 집합 자료형은 순서가 없다는 특징이 있는데, 문제에서 오름차순으로 출력해야 하기에 오름차순으로 정렬해 주고 출력한다.
'Coding Test' 카테고리의 다른 글
Python 백준 알고리즘 1717 : 집합의 표현 (1) | 2023.02.02 |
---|---|
Python 백준 알고리즘 : 1065 한수 (0) | 2023.02.01 |
Python 백준 알고리즘 15596 : 정수 n개의 합 (0) | 2023.02.01 |
Python 백준 알고리즘 4344 : 평균은 넘겠지 (0) | 2023.02.01 |
Python 백준 알고리즘 8959 : OX퀴즈 (0) | 2023.02.01 |