공대생

백준 4673 셀프넘버 Python 본문

스터디/백준

백준 4673 셀프넘버 Python

상수나무 2022. 1. 3. 00:32

실버 5 난이도의 문제.

 

처음 접근은 리스트로 시작했다. 리스트에 1~10000까지의 숫자를 넣고 셀프넘버가 아닌 수들의 리스트를 만들어 두 리스트의 차집합(?)을 구하려고 하였다. 

 

또한 d(n) 함수도 n이 100보다 작을 땐 d(n) = n + n/10 + n%10

100보다 크고 1000보다 작을 땐 d(n) = n + n/100 + (n-100)/10 + (n-100)%10

이런식으로 조건문을 이용해 구할 생각이었다. 

 

하지만 이렇게 코드를 짜면 n이 10000 이상이 될 때는 코드를 다시짜야하는 비효율적인 코드라고 생각하고 다시 찾아보니 n을 str로 변환하면 해당 문자열을 for문을 이용해 한글자씩 떼어낼 수 있다는 것을 알아냈다.

 

예를 들어

a = str(408) 

for i in a:
 print(i)

 이면 

4
0
8

이렇게 출력되는 것이다.

이를 이용해서 생성자가 있는 수들을 모두 찾아 c_list에 집어넣도록 했다.

1~10000까지 들어있는 original_list를 만들고 이 리스트에서 c_list의 차집합을 구해 해당 집합을 출력하면 정답이 된다.

 

리스트 이용

def d(n):
    
    con = 0
    s = str(n)
        
    for a in s:
            
        con += int(a)

    return n+con

original_list  = list(range(1, 10001))
c_list = list()

for z in range (1, 10001):
    c_list.append(d(z))

result = set(original_list) - set(c_list)

for r in sorted(result):
    print(r)

 

리스트 말고 집합으로 하는 방법도 성공하여 두가지 방법으로 풀었다. 

 

집합 이용

def d(n):
    
    con = 0
    s = str(n)
        
    for a in s:
            
        con += int(a)

    return n+con

original_list  = set(range(1, 10001))
c_list = set()

for z in range (1, 10001):
    c_list.add(d(z))

result = original_list - c_list

for r in sorted(result):
    print(r)

'스터디 > 백준' 카테고리의 다른 글

백준 1012 유기농배추 Python  (0) 2022.05.21
백준 18111 마인크래프트 Python  (0) 2022.05.19
백준 11401 이항 계수 3 Python  (0) 2022.03.06
백준 5622 다이얼 Python  (0) 2022.01.04
백준 2908 상수 Python  (0) 2022.01.04
Comments