[백준] 1744번 - 수 묶기

Cllaude·2023년 7월 11일
1

backjoon

목록 보기
32/65


문제 분석

문제를 읽어보고 수를 적절히 묶는 방법을 생각해보면 다음과 같이 분류될 수 있다는 것을 파악할 수 있다.
'음수인 수의 목록, 0의 수의 목록, 1의 수의 목록, 1 보다 큰 양수의 목록'
음수의 목록의 경우 오름차순으로 정렬이 되어 있을 때, 작은 값들 부터 곱해서 결과값에 더하면 되고, 이때 음수가 하나 남는 경우,
0의 수의 목록을 참고하여 0의 값이 하나라도 존재하면, 결과값에 0을 더하고 0의 수의 목록이 존재하지 않으면 음수값을 결과값에 더한다.
1의 수의 목록의 경우에는 해당 1의 개수만큼 결과값에 더하는 과정을 거쳐야한다.
1보다 큰 양수의 목록은 내림차순 정렬 되어 있는 경우 앞에서 부터 2개씩 묶어서 곱한 값을 결과값에 더하고 만약 마지막에 1개가 남는 경우 해당 값을 결과값에 더한다.


소스 코드

# 수 묶기

from queue import PriorityQueue
import sys
input = sys.stdin.readline

negativeQueue = PriorityQueue()
positiveQueue = PriorityQueue()
zero = []
one = []
result = 0

N = int(input())
for _ in range(N):
    num = int(input())
    if num < 0:
        negativeQueue.put(num)
    elif num == 0:
        zero.append(0)
    else:
        if num == 1:
            one.append(1)
        else:
            positiveQueue.put((-num, num))

while negativeQueue.qsize() > 1:
    first = negativeQueue.get()
    second = negativeQueue.get()
    result += (first * second)

if not negativeQueue.empty():
    if not zero:
        result += (negativeQueue.get())

result += len(one)

while positiveQueue.qsize() > 1:
    first = positiveQueue.get()[1]
    second = positiveQueue.get()[1]
    result += (first * second)

if not positiveQueue.empty():
    result += positiveQueue.get()[1]

print(result)

0개의 댓글