본문 바로가기

알고리즘/구현

파이썬 | 백준 | 1744 | 수 묶기

solution

1. 수가 양수인 경우, 음수인 경우를 나눈다.

      양수 → 최대힙

      음수 → 최소힙

2. 우선순위 큐 사용

# 1744, 수 묶기
import sys
import heapq

N = int(sys.stdin.readline())
positive = []
negative = []
zero = False

for _ in range(N):
    num = int(sys.stdin.readline())
    if num > 0:
        heapq.heappush(positive, (-num, num))    # 양수
    elif num < 0:
        heapq.heappush(negative, num)   # 음수
    else:
        zero = True     # 0이 있는지

res = 0

# 양수
flag = 0
tmp1, tmp2 = 0, 0
while positive and positive[0][1] > 1:
    if flag == 0:
        tmp1 = heapq.heappop(positive)[1]
        flag = 1
    else:
        tmp2 = heapq.heappop(positive)[1]
        flag = 0
        res += tmp1*tmp2
# 양수의 개수가 홀수면 힙에 남아있는 수를 결과 res에 더한다.
if flag:
    res += tmp1
# 힙에 1 남아있으면 더함
while positive:
    res += heapq.heappop(positive)[1]

# 음수
flag = 0
while negative:
    if flag == 0:
        tmp1 = heapq.heappop(negative)
        flag = 1
    else:
        tmp2 = heapq.heappop(negative)
        flag = 0
        res += tmp1*tmp2
# 힙에 남아있는 수가 있는 경우 수열에 0이 있으면 0을 곱해서 0을 만듦(상쇄)
if flag:
    # 수열에 0이 없으면
    if not zero:
        res += tmp1

print(res)

문제 출처 www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net