728x90

추석이지만 코로나로 친척집에 안 가는 김에 새벽까지 문제를 풀고 있습니다.

언제쯤이면 이 판데믹이 끝날까요? 🤦‍♂️

설에는 마음 놓고 마스크를 벗고 돌아다니고 싶네요.

 

4673번: 셀프 넘버

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

www.acmicpc.net

문제

셀프 넘버는 생성자가 없는 수이다.

예를 들어 10의 경우 10 + 1 + 0 = 11이 되므로 10은 11의 생성자가 된다.

1부터 10000까지 셀프넘버를 출력하는 문제이다.

풀이

셀프 넘버의 체크를 위해 1부터 10001까지 0 값을 가지는 배열을 만들어 둔다.

그리고 1부터 10000까지 반복문을 돌리면서 이 문제의 각 자리수를 더하는 함수를 실행한 뒤, 나온 수를 미리 만들어 둔 배열의 인덱스로 해서 값을 1로 변경한다. list index out of range를 피하기 위해 인덱스 값이 9999를 넘지 않도록 조건문을 걸어 준다.

 

마지막으로 결과 리스트에서 값이 0인 경우의 인덱스+1 을 출력한다.

코드
ans = [0]*10000
# 셀프넘버인지 체크
for i in range(10000):
    a = i//10000
    b = i//1000
    c = (i//100)%10
    d = (i//10)%10
    e = i%10
    res = i+(a+b+c+d+e)-1
    if res<=9999:
        ans[res] = 1
for i,v in enumerate(ans[0:10000]):
    if v == 0:
        print(i+1) # 인덱스 값이므로 1을 더해서 출력

 

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기