본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 4673번 셀프 넘버(with python)

by 윤무무 2023. 1. 19.

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

일단 문제를 읽으면서 셀프 넘버에 대해 약 57퍼정도 이해를 못 했고, 당연히 혼자서 문제를 해결하지도 못했다.

 

코드만 봐도 이해가 잘 안돼서 ㅜㅜ 설명이 잘 적혀있는 블로그를 열심히 찾았음 😎

 

참고 링크 1: https://velog.io/@dbrudskql823/%EB%B0%B1%EC%A4%80-4673-%EC%85%80%ED%94%84%EB%84%98%EB%B2%84-%ED%8C%8C%EC%9D%B4%EC%8D%AC

참고 링크 2:https://wook-2124.tistory.com/252

 

1. 해결한 과정
num_list = set(range(1,10001))
rem_list = set()

for num in num_list:
    for nu in str(num):
      num+=int(nu)
    if num <= 10000:
      rem_list.add(num)

self_num = num_list - rem_list

for s in sorted(self_num):
  print(s)

 

1) num_list = set(range(1,10001))

 

self number은 10000보다 작은 수가 나올 것이기 때문에 1부터 10000이 들어있는 set을 생성한다.

여기서 list가 아닌 set을 생성한 이유는 self number가 중복이 나올 수 있는 확률이 있고, 이를 제거해주기 위해서이다. 

 

2) rem_list = set()

 

위의 설명과 동일하게, 숫자의 중복을 없애기 위해 set()을 생성한다.

 

3)

for num in num_list:
    for nu in str(num):
      num+=int(nu)
 
 
아까 생성해놓은 num_list에서 값을 하나씩 꺼내온다.
 
또한 현재는 정수형이기 때문에 각 자리수를 더하기 위해서 문자열로 바꿔준다.
 
즉, 38 =>  38 + 3 + 8 = 49 와 같은 조건을 맞추기 위해 
 
num을 문자열로 바꿔준 후, 반복문으로 더해주는 것
 
 
4) self_num = num_list - rem_list
 
set 자료형은 A집합에서 B집합을 뺄 수 있기 때문에 rem_list를 빼줌으로써 생성자가 없는 숫자들만 남는다.
 
5) 
 
for s in sorted(self_num):
  print(s)
  
 
set은 순서가 없는 자료형이다. 따라서 sorted()함수를 이용해 오름차순으로 정렬해준 후, 하나씩 출력한다.

 

댓글