μ•Œκ³ λ¦¬μ¦˜

[BOJ] μ†Œμˆ˜μ˜ κ³± - λ°±μ€€ 2014 (μžλ°” JAVA) - PriorityQueue

dev-sy 2023. 4. 2. 11:15

πŸ”’ μ†Œμˆ˜μ˜ κ³± - λ°±μ€€ 2014

https://www.acmicpc.net/problem/2014

 

문제

K개의 μ†Œμˆ˜κ°€ μžˆλ‹€. μ΄λ•Œ, 이 μ†Œμˆ˜λ“€ μ€‘μ—μ„œ λͺ‡ 개λ₯Ό κ³±ν•΄μ„œ μ–»κ²Œ λ˜λŠ” μˆ˜λ“€μ΄ μžˆμ„ 것이닀. μ†Œμˆ˜λ“€μ„ 선택할 λ•Œμ—λŠ” 같은 수λ₯Ό 선택해도 되며, μ£Όμ–΄μ§€λŠ” μ†Œμˆ˜ μžμ²΄λ„ ν¬ν•¨μ‹œν‚€μž.

예λ₯Ό λ“€μ–΄ μ„Έ μ†Œμˆ˜κ°€ 2, 5, 7μ΄μ—ˆλ‹€λ©΄, μ΄λŸ¬ν•œ 곱듀을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ‚˜νƒ€λ‚΄ 보면, 2, 4, 5, 7, 8, 10, 14, 16, 20, 25, 28, 32, 35, 등이 λœλ‹€.

K개의 μ†Œμˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΄λŸ¬ν•œ μ†Œμˆ˜μ˜ κ³±λ“€ μ€‘μ—μ„œ N번째 수λ₯Ό ꡬ해 보자. 단 정닡은 231보닀 μž‘μ€ μžμ—°μˆ˜μ΄λ‹€.

 

μž…λ ₯

첫째 쀄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ μ€„μ—λŠ” K개의 μ†Œμˆ˜κ°€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ£Όμ–΄μ§„λ‹€. 같은 μ†Œμˆ˜κ°€ μ—¬λŸ¬ 번 μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†μœΌλ©°, μ£Όμ–΄μ§€λŠ” μ†Œμˆ˜λŠ” λͺ¨λ‘ 541보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 λ¬Έμ œμ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ μ†Œμˆ˜μ˜ 곱을 λ‚˜μ—΄ν–ˆμ„ λ•Œ, N번째 μ˜€λŠ” 것을 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯

 

4 19

2 3 5 7

 

예제 좜λ ₯

27

πŸ”‘ 문제 풀이

πŸ“Œ μ€‘λ³΅μ œκ±°

 

μ£Όμ–΄μ§„ μ†Œμˆ˜λ₯Ό λͺ¨λ‘ μš°μ„ μˆœμœ„νμ— λ„£κ³  ν•˜λ‚˜μ”© λΉΌλ‚΄λ©΄μ„œ μ£Όμ–΄μ§„ μ†Œμˆ˜λ“€κ³Ό κ³±ν•΄μ„œ λ‹€μ‹œ μš°μ„ μˆœμœ„νμ— λ„£λŠ”λ‹€.

 

μ—¬κΈ°κΉŒμ§€λŠ” λ°”λ‘œ λ– μ˜€λ₯΄λŠ” λΆ€λΆ„μ΄μ—ˆλŠ”λ° λ¬Έμ œλŠ” μ€‘볡 μ œκ±°λ‹€. 예λ₯Ό λ“€λ©΄ 2*2*3, 3*2*2, 2*3*2 이 쀑에 ν•œ 개만 큐에 λ„£μ–΄μ•Ό ν•œλ‹€. 

그러면 κ·œμΉ™μ„ μ •ν•΄μ•Ό ν•˜λŠ”λ° λ¨Όμ € κ³±ν•˜λŠ” μˆ˜κ°€ 뒀에 κ³±ν•˜λŠ” μˆ˜λ³΄λ‹€ ν¬κ±°λ‚˜ μž‘μ€ 수만 큐에 넣도둝 ν•˜λ©΄ λœλ‹€. 문제 예제(primesλ°°μ—΄ : 2,3,5,7) 둜 예λ₯Ό λ“€λ©΄

 

3*2
3*2*2
5*3*3
5*5*3*2

 

μš°μ„ μˆœμœ„νμ—μ„œ poll을 ν•œ 수(κ°€μž₯ μž‘μ€ 수)에 for문으둜 μ£Όμ–΄μ§„ μ†Œμˆ˜λ“€κ³Ό κ³±ν•˜λŠ”λ° μ–΄λ–»κ²Œ 이 κ·œμΉ™μ„ μ μš©μ‹œν‚¬κΉŒ?

 

<μš°μ„ μˆœμœ„νμ—μ„œ λΉΌλ‚Έ 수> % primes[i] == 0 이면 κ·Έλ‹€μŒ μ†Œμˆ˜μ™€ κ³±ν•˜λ©΄ μ•ˆ λœλ‹€. (μ£Όμ–΄μ§„ μ†Œμˆ˜ 배열은 μ˜€λ¦„μ°¨μˆœ)

ν•΄λ‹Ή μ†Œμˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§„λ‹€λ©΄ μ†ŒμΈμˆ˜λΆ„ν•΄ μ‹œ ν•΄λ‹Ή μ†Œμˆ˜κ°€ 이미 μ‘΄μž¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ ν•΄λ‹Ή μ†Œμˆ˜λ³΄λ‹€ 큰 μ†Œμˆ˜ (μ†Œμˆ˜ λ°°μ—΄μ—μ„œ 뒀에 μžˆλŠ” μ†Œμˆ˜λ“€)λ₯Ό κ³±ν•˜λ©΄ μ•ˆ λœλ‹€.

 

λ§Œμ•½ poll을 ν•œ μˆ˜κ°€ 9 (=3*3) 라면 뒀에 2, 3 외에 λ‹€λ₯Έ 수λ₯Ό κ³±ν•˜λ©΄ μ•ˆ λœλ‹€. 
9 % 2 != 0 -> 9 *2 = 18은 μš°μ„ μˆœμœ„νμ— λ„£κ³ 
9 % 3 == 0 -> 9 *3 = 27κΉŒμ§€ μš°μ„ μˆœμœ„νμ— λ„£κ³  5λΆ€ν„°λŠ” (3 * 3 * 5 λŠ” κ·œμΉ™μ— μ–΄κΈ‹λ‚˜κΈ° λ•Œλ¬Έμ—) μš°μ„ μˆœμœ„νμ— λ„£μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

top = pq.poll(); // pqλŠ” μš°μ„ μˆœμœ„ν

for (long prime : primes) { // primesλŠ” μ£Όμ–΄μ§„ μ†Œμˆ˜ λ°°μ—΄
  pq.add(top * prime);  
  if(top % prime == 0) break;
}

 

πŸ“Œ μ •μˆ˜ λ²”μœ„

 

또 μ£Όμ˜ν•  점은 정닡이 2^31 보닀 μž‘μ€ μˆ˜μ—¬μ•Ό ν•œλ‹€λŠ” 점이닀.

μ •μˆ˜ νƒ€μž…μœΌλ‘œ μ§€μˆ˜ 계산은 Shiftμ—°μ‚°μž (>>) λ‘œ ν•  수 μžˆλ‹€.
ν•˜μ§€λ§Œ int λ²”μœ„λŠ” -2^31 ~ 2^31κΉŒμ§€λ‘œ 2 >> 31을 ν•˜λ©΄ 0이 λ‚˜μ˜¨λ‹€.
λ”°λΌμ„œ long으둜 νƒ€μž… λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜κ³  μš°μ„ μˆœμœ„ν, μ†Œμˆ˜ 배열도 λͺ¨λ‘ long으둜 νƒ€μž…μ„ μ„ μ–Έν•΄μ•Ό ν•œλ‹€.
그리고 μš°μ„ μˆœμœ„νμ— 값을 넣을 λ•Œ λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§„ λ²”μœ„ (2^31)λ₯Ό λ„˜μ§€ μ•Šλ„λ‘ if문으둜 κ±ΈλŸ¬μ€˜μ•Ό ν•œλ‹€.

전체 μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int K = Integer.parseInt(st.nextToken());
		int N = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
    
		long[] primes = new long[K];
		PriorityQueue<Long> pq = new PriorityQueue<>();
		for (int i = 0; i < K; i++) {
			primes[i] = Long.parseLong(st.nextToken());
			pq.add(primes[i]);
		}
    
		long top = 0;
		while(--N >= 0){
			top = pq.poll();
			for (long prime : primes) {
				if(top * prime >= (long)2 << 31) break;
				pq.add(top * prime);

				if(top % prime == 0) break;
			}
		}
		System.out.println(top);

	}

}

 

 


μ½”ν…Œ 정리 κΉƒν—ˆλΈŒ 링크

 

GitHub - Suyoung225/Algorithms: Java둜 μ•Œκ³ λ¦¬μ¦˜ 문제 풀이

Java둜 μ•Œκ³ λ¦¬μ¦˜ 문제 풀이. Contribute to Suyoung225/Algorithms development by creating an account on GitHub.

github.com

 

728x90