문제
다음과 같이 정의된 수열이 있다.
- D[1] = A
- D[n] = D[n-1]의 각 자리의 숫자를 P번 곱한 수들의 합
예를 들어 A=57, P=2일 때, 수열 D는 {57, 74(=5^2+7^2=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
풀이 .
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = null;
static StringTokenizer st = null;
static ArrayList<String> list = null;
static int ans = 0;
public static void dfs(String num, int p) {
int nextNum = 0;
for(int i = 0; i < num.length(); i++) {
nextNum += Math.pow(num.charAt(i) - '0', p);
}
String nextStr = String.valueOf(nextNum);
if(list.contains(nextStr)) {
ans = list.indexOf(nextStr);
return;
}else {
list.add(String.valueOf(nextStr));
dfs(nextStr, p);
}
}
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
list = new ArrayList<>();
String a = st.nextToken();
int p = Integer.parseInt(st.nextToken());
list.add(a);
dfs(a, p);
System.out.println(ans);
}
}
등장했던 수가 또 등장할 때까지 DFS 반복
'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글
[BOJ] 2667 - 단지번호붙이기 JAVA (0) | 2021.01.19 |
---|---|
[BOJ] 9466 - 텀 프로젝트 JAVA (0) | 2021.01.19 |
[BOJ] 10451 - 순열 사이클 JAVA (0) | 2021.01.19 |
[BOJ] 1707 - 이분 그래프 JAVA (0) | 2021.01.18 |
[BOJ] 11724 - 연결 요소의 개수 JAVA (0) | 2021.01.18 |