[백준 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개의 댓글

관련 채용 정보