[백준] 4673번 - 셀프 넘버

1. 셀프 넘버

A. 문제

위 백준 사이트에 접속하여 문제를 확인해주세요.

B. 내 답안


def d(n):  
    s_n = str(n)  
    result = n  
  
    for i in s_n:  
        result += int(i)  
  
    return result  
  
set_n = set()  
list_n = [i for i in range(1, 10001)]  
  
for i in range(10001):  
    set_n.add(d(i))  
  
# set_n = list(set_n)  
  
for i in list_n:  
    if i not in set_n:  
        print(i)

a. 회고

내 풀이

  • 처음에는 재귀적으로 푸는 방식을 시도했다.
    • 재귀 스택 오버플로우가 발생한다.
  • 그래서 단순히 반복문으로 해결했다.

C. 문제 해설

이해한 내용을 바탕으로 작성했습니다.

셀프 넘버 자체는 특별한 패턴이 없어 보인다. 따라서 d(n)을 구하고 1보다 크고 10000보다 작은 수 중에 d(n)이 아닌 수를 찾아야 한다.

  1. 문제에 주어진대로 d(n)을 구하는 작업을 반복한다.
    • 파이썬은 문자열을 for문에 넣어서 원소 하나씩 꺼낼 수 있다.
  2. d(n)을 만족하는 n(생성자)는 1개 이상일 수 있기 때문에 중복제거를 해줘야 한다.
    • d(n)을 통해 리턴된 값을 set()에 추가하여 중복제거를 해준다.
    • 이 글을 쓰면서 생각난 방식인데, set()을 사용하는 대신, 아래 같은 방식을 이용할 수도 있다.
      
      answer = list()
      
      for i in range(10001):
          temp = d(i)
          if temp not in answer:
              answer.append(temp)
              
      

추가로, 셀프 넘버 예시에 대해 잘 나와있는 자료가 있어서 링크를 걸어본다.

셀프 넘버 - 제타위키 (zetawiki.com)

참고문헌

4673번: 셀프 넘버 (acmicpc.net). Baekjoon. (accessed Sep 14, 2021)

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.