Algorithm/백준

[Python] 1744 수묶기

내영잉 2022. 12. 28. 21:22

1. 문제 📚

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

2. 입출력 예 📋

3. 알고리즘 ✅

- 최대가 나오기 위해선

 

음수에서

경우의 수 1) 음수 * 음수

경우의 수 2) 음수 + 음수

경우의 수 3) 음수 * 0

경우의 수 4) 음수

 

4가지 중에 최대 값을 

 

양수는 

경우의 수 1) 양수 * 양수 

경우의 수 2) 양수 + 양수 

경우의 수 3) 양수

 

3가지 중에 최대 값을 더해야한다

 

따라서 인풋을 따로 따로 받아주어 모든 경우의 수를 따져준당

4. 소스코드 💻

 

import sys

input = sys.stdin.readline

N = int(input().strip())

negative_arr = []
zero_arr = []
positive_arr = []

for i in range(N):
    num = int(input().strip())
    if num < 0:
        negative_arr.append(num)
    elif num == 0:
        zero_arr.append(num)
    else:
        positive_arr.append(num)

positive_arr.sort()
negative_arr.sort(reverse = True)

answer = 0

while negative_arr:
    max_num = 0
    num = negative_arr.pop()
    another_index = -1
    zero_flag = False

    for i in range(len(negative_arr)):
        # 경우의 수1)
        if num * negative_arr[i] > num + negative_arr[i]:
            another_index = i
            max_num = num * negative_arr[i]
        # 경우의 수2)
        else:
            max_num = num
            another_index = -1

    # 경우의 수3) 음수 상쇄
    for i in range(len(zero_arr)):
        if max_num <= num * 0:
            zero_flag = True

    if zero_flag:
        answer += 0
        zero_arr.pop()
    # 겅우의 수4) 묶이지 않는 경우
    elif another_index == -1:
        answer += num
    # 두 수로 묶이는 경우
    else:
        answer += max_num
        negative_arr.pop(another_index)

while positive_arr:
    num = positive_arr.pop()
    another_index = -1
    max_num = 0

    for i in range(len(positive_arr)):
        # 경우의 수1)
        if positive_arr[i] * num > positive_arr[i] + num:
            another_index = i
            max_num = positive_arr[i] * num
        # 경우의 수2)
        else:
            another_index = i
            max_num = positive_arr[i] + num

    # 경우의 수3) 묶이지 않는 경우
    if another_index == -1:
        answer += num
    # 두 수로 묶이는 경우
    else:
        answer += max_num
        positive_arr.pop(i)

print(answer)