TIL 29 | 셀프 넘버 (백준 4673 python)

Gom·2021년 3월 6일
0

Algorithm

목록 보기
8/48
post-thumbnail

접근 방식

# d(n) 공식에 숫자를 대입했을 때 결과가 있다면 그 수는 셀프넘버가 아니다.

# 1부터 1만까지의 수를 대입하여 셀프넘버가 아닌 수를 구한다.

# 1부터 1만까지의 수 중 셀프넘버가 아닌 수를 제외시킨다.

# 남는 값은 셀프넘버가 된다.

정답코드

#문제풀이

def find_self_num():
    self_num = set(range(1,10001))
    generated_num = set()

    for n in self_num: 
        for i in str(n): 
            n += int(i)
        generated_num.add(n)
    self_num = self_num - generated_num
    for n in sorted(self_num):
        print(n)

find_self_num()


1. 처리대상 수 범위를 정하고 집합 자료형으로 저장하였다.

  • set() 함수를 이용하여 집합 자료형을 만들었다.

    리스트가 아닌 집합을 사용한 이유

    차집합을 구하기 위함이다. 중복과 순서가 없는 집합 자료형을 이용하여 차집합을 구하는 것이 리스트들을 비교하는 것보다 훨씬 효율적인 문제였다. 리스트로 비교하기 위한 방식들은 하단에 정리해두었다.


2. 셀프 넘버 여부 확인식

  • 숫자를 string으로 변환하여 각 자릿수별로 분해하여 for문을 실행한다. 분해된 수는 다시 int형으로 변환하여 합산시킨다.
  • 합산하여 나온 값들은 셀프 넘버가 아니라는 의미이므로 이 값들을 모아 generated_num 집합을 만든다.
  • 전체 숫자 범위에서 셀프넘버가 아닌 수들의 집합인 generated_num을 빼주면 셀프 넘버인 수들만 남게된다.

3. 문제 조건에 맞추어 출력한다.

  • 해당 문제의 출력 조건은 한줄에 하나씩 증가하는 순서이다.
  • set()을 통해 만들어둔 집합 자료형은 순서가 정해져있지 않았으므로 sorted() 함수를 이용하여 정렬해주었다.
  • for문을 이용하여 한줄씩 출력되도록 했다.

🎁 도움받은 사이트

백준 파이썬 4673 셀프넘버

🎁 새롭게 알게 된 개념

  • set()을 이용한 집합 자료형 : 중복과 순서가 없는 집합 자료형을 이용하면 List들을 비교하는 것보다 차집합을 적용했을 떄 훨씬 효율적인 문제였다.

위키독스

  • 처음에 적용하려던 방식은 두 개의 리스트를 비교하는 방법이었다.
    1) 각 list를 for문으로 돌리며 비교하는 원시적인 방법
    2) sort 연산자를 이용하여 정렬한 뒤 순서대로 비교하는 방법
    3) set 형태로 변환하여 비교하는 방법

파이썬[Python] 020 두개의 리스트(List) 비교 방법



문제 바로가기🏹

profile
안 되는 이유보다 가능한 방법을 찾을래요

0개의 댓글