👀 문제
https://www.acmicpc.net/problem/2331
👊 도전
1. 설계
- 문제대로 코드를 짠다.
- 현재 숫자 num의 각 자리수에 p제곱한 값이 이전에 나온 값인지 확인하기 위해 HashSet을 이용한다.
- HashSet에 숫자들을 넣고 중복 체크한다.
- 숫자들의 순서를 체크하기 위해 ArrayList를 이용한다.
- 중복 숫자가 나오면 list에서 해당 숫자 인덱스를 리턴하면 된다.
2. 구현 (성공 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*;
import java.io.*;
/**
* @author HEESOO
*
*/
class Main {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int p=sc.nextInt();
ArrayList<Integer> list=new ArrayList<>(); // 숫자 순서대로 저장
HashSet<Integer> set=new HashSet<>(); // 숫자 중복 체크
list.add(a);
set.add(a);
while(true) {
int num=makeNum(a, p); // 다음 숫자 계산
if(set.contains(num)) { // 반복 찾음
System.out.println(list.indexOf(num));
break;
}
// 새로운 숫자일 경우 set, list에 add
set.add(num);
list.add(num);
a=num;
}
}
public static int makeNum(int a, int p) {
int sum=0;
while(a>0) {
sum+=Math.pow(a%10, p);
a/=10;
}
return sum;
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 수열을 구한다
- 새로운 숫자가 나오는지 체크해야하므로 HashSet을 이용한다.
- HashSet에 숫자들을 저장해놓고 중복 체크한다.
- 숫자들의 순서도 중요하다. 따라서 ArrayList를 이용한다.
- 다음 숫자(num)는 makeNum()을 이용해서 구한다.
- set에서 num이 있는지 체크한 후, 있다면 반복 구간을 찾은 것이므로 list에서 해당 인덱스를 리턴한다.
- 없다면 아직 반복 구간이 아니므로 set, list에 넣는다.
👏 해결 완료!
참고
- [BOJ] 백준 2331번 : 반복수열 (JAVA) https://steady-coding.tistory.com/32