알고리즘/baekjoon

[ baekjoon ] 소수상근수 9421번 ( python )

Yanoo 2021. 6. 28. 18:46
728x90
반응형

문제

백준 9421 소수상근수 풀이 ( 파이썬 )

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

 

9421번: 소수상근수

양의 정수 n의 각 자리수의 제곱의 합을 계산한다. 그렇게 해서 나온 합도 각 자리수의 제곱의 합을 계산한다. 이렇게 반복해서 1이 나온다면, n을 상근수라고 한다. 700은 상근수이다. 72 + 02 + 02 =

www.acmicpc.net

 

풀이

지금까지 알고리즘 문제를 풀 때 소수 관련 풀이가 두 가지가 있었는데 이번 문제는 에라토스테네스의 체를 이용한 문제였다.

먼저 범위 안의 소수들을 primes에 넣고 이 소수들이 소수상근수인지 판별하여 확인했다.

소수상근수인지 확인할 때는 각 자리수의 곱을 더한 것이 또 나온다면 반복되는 것이므로 dict을 이용해 dict의 key가 존재한다면 반복되는 값이므로 멈춰서 해당하는 값은 정답에 넣지 않았다.

n=int(input())
a = [False,False] + [True]*(n-1)
primes=[]

for i in range(2,n+1):
  if a[i]:
    primes.append(i)
    for j in range(2*i, n+1, i):
        a[j] = False

# print(primes)
ans=[]
for i in primes:
    visited=dict()
    temp=str(i)
    while True:
        tmp=sum(map(lambda x:int(x)**2,temp))
        # print(i,temp,tmp)
        idx=int(temp)
        if tmp==1:
            ans.append(i)
            break
        if visited.get(idx):
            break
        else:
            visited[idx]=1
        temp=str(tmp)

ans.sort()
for i in ans:
    print(i)
728x90
반응형