/ BOJ

BOJ_2331_반복수열_JAVA

문제 : 반복수열

링크 : BOJ_2331_반복수열

접근 방식

이 문제를 풀이하는 데에는 2가지만 구현하면 된다.

  1. 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개만 파악하고 나면 간단히 구현할 수 있는 문제였다.