파이썬 알고리즘 문제 풀이

Baekjoon Online Judge 1744번. 그리디.

gogi masidda 2023. 1. 13. 21:04

문제 링크
https://www.acmicpc.net/problem/1744

1744번: 수 묶기

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

www.acmicpc.net




정답 코드

import sys

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

result = 0
for i in range(N):
    num = int(input())
    if num > 1:
        positive.append(num)
    elif num <= 0:
        negative.append(num)
    else:
        result += num

positive.sort(reverse=True) #양수는 큰 것부터 최대한 많이 곱해야 큰 값을 얻을 수 있음. 내림차순.
negative.sort() #음수는 작은 것부터 최대한 많이 곱해야 큰 값을 얻을 수 있음. 오름차순.

# 양수끼리 곱해주기
for i in range(0, len(positive), 2):
    if i+1 >= len(positive): #같이 곱해질 짝이 없으면 더하기
        result += positive[i]
    else: #있으면 곱하기
        result += (positive[i] * positive[i+1])

# 음수끼리 곱해주기
for i in range(0, len(negative), 2):
    if i+1 >= len(negative): #같이 곱해질 짝이 없으면 더하기
        result += negative[i]
    else: #있으면 곱하기
        result += (negative[i] * negative[i+1])

print(result)


#0,양수: 덧셈. 0,음수:곱셈
#1,양수: 덧셈. 0,음수:덧셈
#양수,양수: 곱셈. 음수,음수: 곱셈. 양수,음수: 덧셈
728x90