728x90
2014번: 소수의 곱
첫째 줄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 K개의 소수가 오름차순으로 주어진다. 같은 소수가 여러 번 주어지는 경우는 없으며, 주어지는 소수는 모두 541보다 작거나
www.acmicpc.net
🤔 문제분석
우선순위큐로 문제를 해결하였습니다. 배열을 순회하면서 중복된 곱을 피하여 곱셈을 하며 N번 만큼 우선순위 큐에서 꺼내고 넣는다.
중복된 곱을 피하기위해서는 Set자료구조를 활용할 수 있으나, 메모리 초과가 발생하여 다른 방식으로 생각해보아야한다.
아래의 표를보면 파란색을 대칭으로 중복된값이 존재하는것을 볼 수 있다.
2x3, 2x5, 2x7이 있다면 추후 3x2, 5x2, 7x2로 나올 수 있기에 자기자신의 리터레이션에서 나누어 떨어질때 까지만 곱셈 연산을한다. 소수이기때문에 자기자신으로만 나누어떨어 질 수 있다.
💻 코드
import sys
import heapq
input = sys.stdin.readline
K, N = map(int, input().split())
prime = list(map(int, input().split()))
queue = []
for p in prime:
heapq.heappush(queue, p)
for _ in range(N):
num = heapq.heappop(queue)
for i in range(K):
data = num * prime[i]
heapq.heappush(queue, data)
if num % prime[i] == 0:
break
print(num)
🎯 피드백 및 개선사항
우선순위큐로 문제를 해결하는 직감은 받았으나, 중복된 값을 어떻게 처리해야할지 생각을 많이 해봐야 할 문제였습니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 6198번 : 옥상 정원 꾸미기 (0) | 2024.02.23 |
---|---|
[백준] 17299번 : 오등큰수 (0) | 2024.02.23 |
[백준] 2143번 : 두 배열의 합 (0) | 2024.02.20 |
[백준] 1781번 : 컵라면 (0) | 2024.02.20 |
[백준] 1939번 : 중량제한 (0) | 2024.02.19 |