1744번 : 수 묶기 - Python

FriOct·2023년 5월 10일
0

PS

목록 보기
93/108

문제

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

풀이

곱해야 할때 고려해야 하는 것은 3가지이다.

  1. 두 수 모두 양수일때 큰것과 큰것을 곱해야 한다.
  2. 두 수 모두 음수일때 작은것과 작은것을 곱해야 한다.
  3. 0일때는 곱하지 못한 음수중 가장 작은 것을 곱해야 한다.

이렇게 3가지를 고려하기 위해 음수와 양수를 따로 저장합니다.
양수는 parr에 음수와 0은 marr에 저장한 뒤 parr는 오름차순으로 marr은 내림차순으로 정렬하고, pop하면서 곱합니다. marr에는 0이 들어있어, 곱하지 못하고, 남아있는 수(음수)는 0을 곱합니다. 1의 경우는 곱하는게 손해이기 때문에 그냥 바로 더해줍니다.

코드

from sys import stdin
 
input = stdin.readline

N = int(input())
sum = 0
marr = list() #음수를 가지는 리스트
parr = list() #양수를 가지는 리스트

for _ in range(N):
    n = int(input())
    #1의 경우는 더하는 것 밖에 없다.
    if n==1:
        sum += 1
    #0초과면 parr에 넣는다.
    elif n>0:
        parr.append(n)
    #0이하면 marr에 넣는다.
    else:
        marr.append(n)


marr.sort(reverse=True) #내림차순 정렬
parr.sort() #오름차순 정렬

while parr:
    if len(parr)==1:#하나만 남는다면 그냥 더해라
        sum+=parr.pop()
    else: #양수들은 큰것들끼리 곱해서 더한다.
        sum+= parr.pop()*parr.pop()

while marr:
    if len(marr)==1:#하나만 남는다면 그냥 더해라.
        sum+=marr.pop()
    else:#음수는 작은 것들끼리 곱해서 더한다. 0은 남아있는 음수랑 곱해서 넣는다.
        sum+=marr.pop()*marr.pop()

print(sum)
profile
꿈 많은 개발자

0개의 댓글