알고리즘

백준 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++;
        }
    }
}