[백준 2331번] 반복수열 with Java

guswls·2024년 5월 6일
0

알고리즘

목록 보기
23/39
post-custom-banner

문제


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;
	}
}


문제 이해


  • 문제에서 정의된 수열에 대해서 반복되는 수열을 제외한 수열을 출력하면 된다.
  • 문제에서 정의된 수열은 이전 값의 각 자리수를 P만큼 제곱한 합으로 구성된다. 문제를 보면 쉽게 이해할 수 있다.


풀이 방법


  • 문제에 정의된 수열을 구하는 메서드 getRepeat을 구현한다. 각 자리수를 P만큼 제곱한 후 합을 구하는 메서드이다.
  • while문에서 prevcur을 둔다. 이를 통해 이전을 이용해서 현재 수열의 값을 구할 수 있게 만든다.
  • 만약 구한 값이 이미 list에 나온적이 있다면 그 값이 존재하는 list의 인덱스를 반환하고 빠져나온다.
  • 위 값을 list.subList(0, lastIdx).size()로 넘겨주어 반복 구간이 아닌 수열의 개수를 구한다.


핵심 포인트


  • 문제를 막상 보면 문제에 해당하는 수열을 구하는 것은 어렵지 않지만, 반복수열을 어떻게 구할 것이냐가 조금 어려운 부분일 수 있다.
  • 나의 경우는 이전에 나왔던 수가 한번 더 등장하는 경우 그 뒤를 반복수열이라고 생각했다.
  • 그리고 해당 값이 존재하는 인덱스 이전까지의 수열의 개수를 구하는 방법으로 문제의 답을 구했다.


보완할 점 / 느낀 점


  • 문제의 의도가 무엇인지는 모르겠으나, 나의 경우는 반복 수열의 조건을 "같은 수가 한번 더 등장하는 경우"로 이해하여 문제를 해결했다.
  • 만약 반복하지 않는 수열이 수열의 중간에 나오는 경우에는 위 풀이가 성립하지 않을 것인데 약간 감으로 문제를 해결한 감이 있다.


참고자료


profile
안녕하세요
post-custom-banner

0개의 댓글