https://www.acmicpc.net/problem/2331
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int P = sc.nextInt();
List<Integer> list = new ArrayList<>();
list.add(A);
int prev = getRepeat(A, P);
list.add(prev);
int lastIdx = 0;
while (true) {
int cur = getRepeat(prev, P);
if (list.contains(cur)) {
lastIdx = list.indexOf(cur);
break;
}
list.add(cur);
prev = cur;
}
System.out.println(list.subList(0, lastIdx).size());
}
static int getRepeat(int num, int pow) {
String numStr = Integer.toString(num);
int sum = 0;
for (int i = 0; i < numStr.length(); i++) {
int temp = numStr.charAt(i) - '0';
sum += Math.pow(temp, pow);
}
return sum;
}
}
getRepeat
을 구현한다. 각 자리수를 P만큼 제곱한 후 합을 구하는 메서드이다.prev
과 cur
을 둔다. 이를 통해 이전을 이용해서 현재 수열의 값을 구할 수 있게 만든다.list
에 나온적이 있다면 그 값이 존재하는 list
의 인덱스를 반환하고 빠져나온다.list.subList(0, lastIdx).size()
로 넘겨주어 반복 구간이 아닌 수열의 개수를 구한다.반복수열
을 어떻게 구할 것이냐가 조금 어려운 부분일 수 있다.반복수열
이라고 생각했다."같은 수가 한번 더 등장하는 경우"
로 이해하여 문제를 해결했다.