[백준]2331_반복수열

김피자·2023년 3월 13일
0

백준

목록 보기
27/42
post-thumbnail

문제

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

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

예를 들어 A=57, P=2일 때, 수열 D는 [57, 74(=52+72=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)가 주어진다.


출력

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


예제 입력

57 2

예제 출력

4

풀이

contains 메소드 이용해서 해결했다.
위에서 D = {57, 74, 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, 58,...}이 주어질 떄 37부터 반복된다 했으니 반복되지 않는 수열 {57, 74, 65, 61}의 개수인 4를 반환하면 된다.

ArrayList에 각 수를 P만큼 제곱한 값을 계속 추가하면서 어떤 수가 이미 ArrayList에 포함되어있다면, 그 수의 인덱스를 반환

37부터 반복되니 37의 인덱스 4를 반환하면, 앞에 반복이 안되는 수의 개수를 알 수 있다.

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine());

		int A = Integer.parseInt(st.nextToken());
		int P = Integer.parseInt(st.nextToken());

		List<Integer> list = new ArrayList<>();
		list.add(A);

		while (true) {
			int temp = list.get(list.size() - 1); // 리스트 가장 최근값 꺼내오기
			int result = 0;
			while (temp != 0) {
				result += (int) Math.pow(temp % 10, (double) P);
				temp /= 10;
			} // 값 구하기

			// result가 이미 리스트에 있다면
			// 그 result가 가리키는 인덱스 반환
			if (list.contains(result)) {
				int num = list.indexOf(result);
				sb.append(num + " ");
				break;
			}

			list.add(result);
		}
		System.out.println(sb);
	}
}
profile
제로부터시작하는코딩생활

0개의 댓글