알고리즘
백준 2312번 수 복원하기 (JAVA)
박카스마시며코딩
2023. 10. 21. 14:20
https://www.acmicpc.net/problem/2312
2312번: 수 복원하기
첫째 줄에 테스트 케이스의 수가 주어진다. 각 테스트 케이스마다 양의 정수 N (2 ≤ N ≤ 100,000)이 주어진다.
www.acmicpc.net
저는 구현을 통해 문제를 해결하였습니다.
먼저 입력을 다 받고 그 중 가장 큰 수를 찾고, 이 값보다 작은 소수를 찾았습니다.
그리고 각각의 수에 해당 소수를 나눌 수 있는 만큼 나누고 이 값들을 출력하여 문제를 해결하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public class BOJ_2312 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(br.readLine());
int[] input = new int[n];
int max = 0;
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(br.readLine());
max = Math.max(input[i],max);
}
List<Integer> prime = findPrime(max);
for(int i = 0 ; i < n ; i++){
cal(input[i],prime);
}
}
private static List<Integer> findPrime(int max) {
List<Integer> result = new ArrayList<>();
for(int i = 2 ; i <= max ; i++){
if(isPrime(i)){
result.add(i);
}
}
return result;
}
private static boolean isPrime(int num) {
for(int i = 2; i < num ; i++){
if(num % i == 0){
return false;
}
}
return true;
}
private static void cal(int num,List<Integer> prime) {
int index = 0;
while(num > 1){
int nowPrime = prime.get(index);
int cnt = 0;
while(num % nowPrime == 0){
num /= nowPrime;
cnt++;
}
if(cnt != 0){
System.out.println(nowPrime+" "+cnt);
}
index++;
}
}
}