Algorithm

[Baekjoon]2331번 반복수열 - Javascript

호밀이 2023. 12. 28. 20:59

https://www.acmicpc.net/problem/2331

 

2331번: 반복수열

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

www.acmicpc.net

문제

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

  • 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)가 주어진다.

출력

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

예제 입력 1 복사

57 2

예제 출력 1 복사

4

 

문제풀이(1)

주어진 수 A부터 한자리수씩 A^P로 계산하여 더한 값을 배열에 추가한 뒤 배열에 한번이라도 나왔던 수라면 반복을 정지한다.
[57, 74(=5^2+7^2=25+49), 65(=7^2+4^2=49+16), 61, 37, 58, 89, 145, 42, 20, 4, 16, 37]

그 후 한번이라도 나왔던 수가 몇번째 인덱스에 추가되었는지 확인하면 반복수열을 제거했을 때 남는 수열의 개수를 구할 수 있다.

57, 74, 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37 일 경우 37이 두번등장 하기 때문에 그 사이는 반복수열이다.
반복수열을 제거하면 57, 74, 65, 61 이므로 4개가 남는데 이때, 37이 처음으로 나온 index값은 4이므로 4를 출력하면 반복수열을 제외한 나머지 수열의 개수를 알 수 있다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [A, P] = require("fs").readFileSync(filePath).toString().trim().split(" ").map(Number);

const arr = [A];

const answer = [];

while (true) {
  const prevNum = String(arr.at(-1));
  const nextNum = prevNum.split("").reduce((acc, cur) => acc + Number(cur) ** P, 0);

  if (arr.includes(nextNum)) {
    console.log(arr.indexOf(nextNum));
    break;
  }

  arr.push(nextNum);
}