[백준 2014] 소수의 곱(Java)

최민길(Gale)·2023년 11월 17일
1

알고리즘

목록 보기
149/172

문제 링크 : https://www.acmicpc.net/problem/2014

이 문제는 우선순위 큐를 이용하여 풀 수 있습니다. 초기 주어진 소수들을 우선순위 큐에 넣은 후 우선순위 큐에서 하나씩 뽑아 주어진 소수들을 곱한 값을 다시 우선순위 큐에 넣습니다. 이 과정을 N번 반복하게 되면 가장 마지막으로 우선순위 큐에서 뽑아진 수가 곧 N번째 수가 됩니다.

여기서 주의할 점은 중복되는 수를 처리하는 방법입니다. 두 수의 곱의 특성 상 2X3, 3X2 이렇게 두 개가 존재할 수 있습니다. 이는 현재 수와 주어진 소수를 나누었을 때 나머지가 0인 경우를 기준으로 이전값만 취하게 된다면 중복 없이 값을 입력받을 수 있습니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    static int K,N;
    static long[] prime;
    static PriorityQueue<Long> queue = new PriorityQueue<>();

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        K = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        prime = new long[K];
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<K;i++){
            prime[i] = Integer.parseInt(st.nextToken());
            queue.add(prime[i]);
        }

        long curr = 0;
        while(N-- >0){
            curr = queue.poll();

            for(int i=0;i<K;i++){
                long val = curr * prime[i];
                if(val > (long) Math.pow(2,31)) break;
                queue.add(curr * prime[i]);
                System.out.println(N + " " + curr + " " + val);

                if(curr % prime[i] == 0) break;
            }


        }
        System.out.println(curr);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글