티스토리 뷰

 

[Python] 백준 알고리즘 온라인 저지 4673번 : 셀프 넘버

 

Python3 코드

 

1) list에서 사용할 수 있는 함수를 활용한 코드

numbers = list(range(1, 10_001))
remove_list = []  # 이후에 삭제할 숫자 list
for num in numbers :
    for n in str(num):
        num += int(n)  # 생성자가 있는 숫자
    if num <= 10_000:  # 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)

 

2) set에서 사용할 수 있는 함수를 활용한 코드

numbers = set(range(1, 10000))
remove_set = set()  # 생성자가 있는 숫자 set
for num in numbers :
    for n in str(num):
        num += int(n)
    remove_set.add(num)  # add: 집합에 요소를 추가할 때

self_numbers = numbers - remove_set  # set의 '-' 연산자로 차집합을 구함
for self_num in sorted(self_numbers):  # sorted 함수로 정렬
    print(self_num)

 

 

Python3 코드 풀이

 

1. 코드 풀이에 대한 전체적인 내용 정리

이번 문제는 1부터 10,000까지 숫자 중 생성자가 있는 숫자를 제외한 셀프 넘버를 출력하는 문제이다. 문제를 풀 때, 생성자가 있는 숫자의 리스트(또는 집합)를 먼저 생성했고 이후에 1부터 10,000까지의 숫자 범위에서 생성자가 있는 숫자를 빼는 방식으로 풀었다. 

 

코드는 리스트의 특성을 이용한 코드와 집합 자료형을 이용한 코드 두가지 경우를 작성해보았다. 개인적으로는 set의 차집합을 이용하는 코드가 좀 더 이용하기가 편하다고 생각한다.

 

2. 리스트의 특성을 이용한 코드작성

2-1. 생성자가 있는 숫자를 추가할 때

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

numbers는 1~10,000까지의 숫자로 이루어진 리스트이다. 이 리스트에서 숫자를 하나씩 꺼내서 각 자릿수를 분리하고 더한 수를 빈 리스트에 append 함수로 추가하였다. 이 추가한 숫자는 생성자가 있는 숫자로 이후에 1~10,000까지의 숫자 리스트에서 삭제할 숫자들이다.

 

숫자를 분리할 때는 str함수를 이용해서 문자열로 변환을 했는데 그 이유는 숫자 형태로는 각 자릿수를 분리시킬 수 없기 때문이다. 그리고 각 자릿수를 합한 수를 num 변수에 선언하였고 해당 수는 10,000보다 작은 수인 경우에만 빈 리스트에 추가하였다. 아래에서 remove 함수를 이용해서 이 리스트에 있는 원소를 삭제해나갈 때 10,000보다 큰 수가 있으면 ValueError 에러가 발생하기 때문이다.

 

2-2. remove 함수로 원소를 삭제한다.

for remove_num in set(remove_list) :  # set 으로 중복값 제거
    numbers.remove(remove_num)

위에서 생성한 생성자가 있는 숫자로 이루어진 리스트(remove_list)는 중복되는 숫자가 있다. 이 숫자를 제거하기 위해서 set 함수를 이용해서 set 자료형으로 변환하였다. 그렇게 되면 수학의 집합과 동일한 성일을 가진 자료형이기 때문에 중복된 요소를 제거할 수 있다. 삭제하는 함수는 remove 함수를 사용하였다.

 

3. 집합 자료형의 특성을 이용한 코드 작성

3-1. 생성자가 있는 숫자를 추가할 때

remove_set = set()  # 생성자가 있는 숫자 set
for num in numbers :
    for n in str(num):
        num += int(n)
    remove_set.add(num)  # add: 집합에 요소를 추가할 때

리스트를 사용한 코드와 기본적인 뼈대는 같다. 대신 빈 셋을 생성할 때는 set( ) 함수를 사용해주고 생성자가 있는 숫자를 빈 집합에 추가할 때는 add 함수를 사용해주었다. 

 

3-2. 차집합 연산으로 생성자가 있는 숫자 집합을 빼준다.

self_numbers = numbers - remove_set  # set의 '-' 연산자로 차집합을 구함

차집합 연산은 간단하게 한 줄로 표현이 가능하다. 1~10,000까지 숫자로 이루어진 집합에서 생성자가 있는 숫자의 집합을 - 기호로 빼준다. 

 

3-3. 출력할 때는 sorted 함수로 정렬시켜준다.

for self_num in sorted(self_numbers):  # sorted 함수로 정렬
    print(self_num)

집합 자료형은 중복요소가 들어갈 수 없는 성질 이외에도 순서가 없다는 특징이 있다. 그런데 이번 문제는 셀프 넘버를 1부터 순서대로 출력해야 하기 때문에 sorted 함수를 이용해서 내림차순으로 정렬을 해주었다.

해당 함수의 revers 파라미터 값이 False이기 때문에 오름차순으로 정렬할 때는 revers=True로 지정해서 사용할 수 있다. 

 

반응형
댓글
반응형