BOJ_2331_반복수열_JAVA
문제 : 반복수열
링크 : BOJ_2331_반복수열
접근 방식
이 문제를 풀이하는 데에는 2가지만 구현하면 된다.
-
2자리 이상의 숫자를 각 자릿수별로 분리하는 것
-
리스트에서 중복되는 값이 생기는 위치를 알아내는 것
1번의 경우에는 문제에서 각 자릿수의 P제곱의 합을 순열에 추가하라는 것이 지시사항이었으니 당연히 해야 하는 것이고, 2번은 어찌되었든 1번의 과정을 계속해서 반복하다 보면 중복되는 수열이 생긴다는 것을 설명했기 때문에, 이전과 같은 값이 한 개라도 나오는 순간 그 뒤부터는 중복 수열이 반복된다고 생각하면 된다. 따라서, 최초 중복된 값이 나타난 위치가 지금까지 중복되지 않은 수의 개수가 되는 것이다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BOJ_2331_반복수열 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int A = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
ArrayList<Integer> list = new ArrayList<>();
list.add(A);
while(true) {
int num = list.get(list.size()-1);
int sum = 0;
while(num > 0) {
sum = (int) (sum + Math.pow(num%10, P));
num = num / 10;
}
// System.out.println(sum);
for(int i=0,n=list.size();i<n;i++) {
if(list.get(i) == sum) {
System.out.println(i);
return;
}
}
list.add(sum);
}
}
}
문제가 얼핏 보면 헷갈릴 수 있지만, 핵심 조건 2개만 파악하고 나면 간단히 구현할 수 있는 문제였다.