본문 바로가기
백준

[백준] 4673번 : 셀프 넘버 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 1.
728x90
반응형

 

 

4673번: 셀프 넘버

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

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

  1. 1부터 10,000까지 사이에서 출력하는 것이므로 1부터 10,000까지 수를 저장한 리스트를 생성한다. li = list(1, 10001))
  2. 반복 횟수를 저장하고 셀프 넘버를 생성할 변수를 생성하고 1로 초기화해 준다. N = 1
  3. 원하는 지점에서 종료하기 위해 무한 반복문을 활용한다. while (True)
  4. 만약 횟수가 10,000을 넘어가면 반복문을 종료한다. if (N > 10000): break
  5. 아니면 셀프 넘버를 생성하는 함수를 실행하고 값을 저장한다. D = d(N)
  6. 함수에서는 매개변수로 입력받은 값의 생성자를 만들고 만든 값을 반환한다. def d(n) 함수 확인
  7. 만약 반환된 생성자가 리스트 안에 있으면 생성자를 리스트에서 제거한다. if (D in li): li.remove(D)
  8. 그리고 다음 수로 넘겨준다. N += 1
  9. 생성자를 모두 제거한 리스트의 원소를 하나씩 출력한다. for i in li: print(i)

다른 풀이

  1. 셀프 넘버를 저장할 리스트를 생성하고 1부터 10,000까지 수를 저장한다. self_num = list(range(1, 10001))
  2. 셀프 넘버가 아닌 생성자를 저장할 공백 리스트를 생성한다. num_list = list()
  3. 1부터 10,000까지 10,000번을 수행하며 생성자를 찾는다. for i in range(1, 10001)
  4. 만약 생성자가 10,000 이하의 숫자이고 생성자 리스트에 없는 숫자라면 if (d(i) <= 10000) and (d(i) not in num_list)
  5. 함수에서는 입력받은 매개변수의 각 자릿수를 더하여 생성자를 만들고 그 값을 반환한다. def d(n) 함수 확인
  6. 생성자 리스트에 생성자를 추가한다. num_list.append(d(i))
  7. 전부 추가된 생성자 리스트의 원소를 하나씩 추출하여 for i in num_list
  8. 셀프 넘버 리스트에서 그 값을 제거한다. self_num.remove(i)
  9. 생성자를 모두 제거한 리스트의 원소를 하나씩 출력한다. for i in self_list: print(i)
반응형

3. 소스코드

def d(n):
    s = 0
    
    if(n < 10):
        s = n + (n % 10)
    elif(n < 100):
        s = n + (n // 10) + (n % 10)
    elif(n < 1000):
        s = n + (n // 100) + (n % 100 // 10) + (n % 10)
    elif(n < 10000):
        s = n + (n // 1000) + (n % 1000 // 100) + (n % 100 // 10) + (n % 10)
    elif(n < 100000):
        s = n + (n // 10000) + (n % 10000 // 1000) + (n % 1000 // 100) + (n % 100 // 10) + (n % 10)
        
    return s

li = list(range(1, 10001))

N = 1
while(True):
    if(N > 10000):
        break
    else:
        D = d(N)
        
        if(D in li):
            li.remove(D)
        
        N += 1

for i in li:
    print(i)
def d(n):
    for i in str(n):
        n += int(i)

    return n

self_num = list(range(1, 10001))
num_list = list()

for i in range(1, 10001):
    if (d(i) <= 10000) and (d(i) not in num_list):
        num_list.append(d(i))

for i in num_list:
    self_num.remove(i)

for i in self_num:
    print(i)

 

첫 번째 소스코드는 실행 시간이 짧지만 소스코드는 길고 두 번째 소스코드는 실행 시간이 두배로 길지만 소스코드의 길이는 절반을 짧다.

728x90
반응형