[Python] 백준 1744번:수 묶기 2가지 풀이(feat.나의2년전코드)

0

알고리즘

목록 보기
2/2

1744번: 수 묶기

알고리즘 유형 : 그리디 Greedy
제한시간 : 2초
난이도 : 골드4

나의 2년 전 코드

N = int(input())
p, m = [], []
ms=0

for _ in range(N):
    n = int(input())

    if n > 1:
        p.append(n)
    elif n == 1:
        ms += 1
    else:
        m.append(n)

p.sort(reverse=True)
m.sort()
#plus
if len(p) % 2 == 0:
    for i in range(0, len(p), 2):
        ms += p[i] * p[i + 1]
else:
    for i in range(0, len(p) - 1, 2):
        ms += p[i] * p[i + 1]
    ms += p[len(p) - 1]
#minus
if len(m) % 2 == 0:
    for i in range(0, len(m), 2):
        ms += m[i] * m[i + 1]
else:
    for i in range(0, len(m) - 1, 2):
        ms += m[i] * m[i + 1]
    ms += m[len(m) - 1]
print(ms)

알고리즘 공부 후 우선순위 큐를 적용한 코드

from queue import PriorityQueue

# 선언
N = int(input())
plusPq = PriorityQueue() # 양수큐
minusPq = PriorityQueue() # 음수큐
one = 0 # 1의 개수
zero = 0 # 0의 개수

# 입력
for i in range(N):
  data = int(input())
  if data >1:
    plusPq.put(data*-1) # 내림차순 정렬을 위해 -1일 곱하여 저장
  elif data ==1:
    one +=1
  elif data ==0:
    zero +=1
  else:
    minusPq.put(data)

# 우선순위 큐이기 때문에 도출된 합이 최대임
sum = 0

# 양수큐에서 큐사이즈가 1개 또는 0개가 될때까지 큰수 두개 곱해서 합에 더해줌
while plusPq.qsize()>1:
  first = plusPq.get()
  second = plusPq.get()
  sum += first*second

# 양수큐의 큐사이즈가 1개이면 -1일 곱해서 더해줌
if plusPq.qsize()>0:
  sum+= plusPq.get()*-1

# 음수큐에서 큐사이즈가 1개 또는 0개가 될때까지 큰수 두개 곱해서 합에 더해줌
while minusPq.qsize()>1:
  first = minusPq.get()
  second = minusPq.get()
  sum += first*second

# 음수큐의 큐사이즈가 1개이면 0개수 확인해보고 더해줌
if minusPq.qsize()>0:
  if zero == 0:
    sum+= minusPq.get()

# 1처리
sum += one

print(sum)

나의 솔직후기....

2년 전에 짠 코드가 더 난잡하고 어려움..어케했누,,,

profile
저는 말하는 감자애오..

0개의 댓글