import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int count = 1;
int[] check = new int[240000];
check[N] = count++;
int result = dfs(N, M, check, count);
System.out.println(result);
}
static int dfs(int N, int M, int[] check, int count) {
String num = Integer.toString(N);
int x = 0;
for (int i = 0; i<num.length(); i++) {
x += Math.pow(num.charAt(i)-'0', M);
}
if (check[x] != 0) {
return check[x]-1;
}
check[x] = count++;
return dfs(x, M, check, count);
}
}
조건에 맞게 나열되는 수열에서 반복수열의 개수를 찾는 문제이다.
수열의 숫자를 인덱스로 삼는 배열을 만든다. 이때 배열의 길이는 주어진 수의 최대 즉, 9999가 나왔을때 9를5승한거에 5를 곱한 236196보다 크게 설정하면된다.
여기서 해당 인덱스가 수열숫자로 나왔을때 그 인덱스에 count값을 저장시켜서 몇번째 수열인지 저장한다. 지금보니 배열의 인덱스와 그 값이 반대의 역할을 하고 있다.
이렇게해서 각 1의자리 숫자마다 접근하기위해 int를 String으로 바꿔준다.
String num = Integer.toString(N);
위와 같이 사용할 수 있고
Math.pow(num.charAt(i)-'0', M);
로 num.charAt(i)-'0'의 M제곱을 변수 x에 더해준다.
그래서 check[x] = 0 이면 처음 나오는 숫자고 0이 아니면 두번째 나오는 숫자다.
0이 아니면 그 배열에 저장된 몇번째인지를 출력한다. 이때 자기자신은 빼야하기 때문에 -1을 해준다.
dfs 메서드는 재귀로 해준다.
String을 int로 변환
int 숫자 = Integer.valueOf(문자열);
int를 String으로 변환
String 문자열 = Integer.toString(숫자);
String 문자열 = String.valueOf(숫자);
프로젝트에 사용할때는 입력값에 따라 try-catch문으로 예외처리를 해줘야한다.
숫자형태로 저장된 String는 .charAt(i) - '0'으로 진짜 int형 숫자로 사용가능하다.
이번문제에서 Math.pow(A, B); 하는데 - '0'을 안해줘서 헤맸다.