[백준] 2331번 반복수열

[백준] 2331번 반복수열

출처: [백준] 2331번 반복수열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 256 MB 9795 4407 3250 44.176%

문제

다음과 같이 정의된 수열이 있다.

  • D[1] = A
  • D[n] = D[n-1]의 각 자리의 숫자를 P번 곱한 수들의 합

예를 들어 A=57, P=2일 때, 수열 D는 {57, 74(=5^2+7^2=25+49), 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, …}이 된다. 그 뒤에는 앞서 나온 수들(57부터가 아니라 58부터)이 반복된다.

이와 같은 수열을 계속 구하다 보면 언젠가 이와 같은 반복수열이 된다. 이때, 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 구하는 프로그램을 작성하시오. 위의 예에서는 {57, 74, 65, 61}의 네 개의 수가 남게 된다.


입력

첫째 줄에 A(1 ≤ A ≤ 9999), P(1 ≤ P ≤ 5)가 주어진다.


출력

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.


예제 입력 1

1
57 2

예제 출력 1

1
4

출처


알고리즘 분류


소스코드1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
temp = 0
while 1:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp in stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P
break
else:
stack.append(temp)

print(stack.index(temp))

소스코드2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
removed_stack = []

while stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp not in stack:
stack.append(temp)
else:
stack.append(temp)
if temp in removed_stack:
break
else:
removed_stack.append(temp)

print(len(set(stack) - set(removed_stack)))

Author

Chaehyeon Lee

Posted on

2021-06-20

Updated on

2021-06-25

Licensed under

댓글