[백준] 1744번 수 묶기

거북이·2023년 2월 18일
0

백준[골드4]

목록 보기
4/59
post-thumbnail

💡문제접근

  • 음수 리스트와 양수 리스트를 따로 만들어서 해결했다.
  • 음수 리스트는 오름차순으로 정렬하고 양수 리스트는 내림차순으로 정렬했다.
  • 0을 음수 리스트에 넣어줬다. 왜냐하면 음수와 0을 더하면 음수가 나오고 음수와 0을 곱하면 0이 나와 곱한 값이 최댓값이 되기 때문이다. 최댓값을 유도하려면 0을 음수 리스트 쪽에 넣어 연산을 해줘야한다.
  • ①. 음수 리스트의 길이가 짝수라면?
    → 음수 2개씩 묶어서 곱해서 더해준다.
  • ②. 음수 리스트의 길이가 홀수라면?
    → 음수 리스트의 마지막 원소를 더하고 나머지는 2개씩 묶어서 곱해서 더해준다.
  • ③. 양수 리스트의 길이가 짝수라면?
    → 양수 2개씩 묶어서 곱해서 더해준다.
  • ④. 양수 리스트의 길이가 홀수라면?
    → 양수 리스트의 마지막 원소를 더하고 나머지는 2개씩 묶어서 곱해서 더해준다.

💡코드(메모리 : 31256KB, 시간 : 40ms)

import sys
input = sys.stdin.readline

N = int(input())
minus_li = []
plus_li = []
for _ in range(N):
    val = int(input())
    if val > 0:
        plus_li.append(val)
    else:
        minus_li.append(val)

minus_li.sort()
plus_li.sort(reverse=True)

ans = 0
# 음수 리스트(0을 포함)
if len(minus_li) % 2 == 0:
    for i in range(0, len(minus_li), 2):
       ans += minus_li[i] * minus_li[i+1]
else:
    ans = minus_li[-1]
    for i in range(0, len(minus_li)-1, 2):
        ans += minus_li[i] * minus_li[i+1]

# 양수 리스트
if len(plus_li) % 2 == 0:
    for i in range(0, len(plus_li), 2):
        if plus_li[i] == 1 or plus_li[i+1] == 1:
            ans += (plus_li[i] + plus_li[i+1])
        else:
            ans += plus_li[i] * plus_li[i+1]
else:
    ans += plus_li[-1]
    for i in range(0, len(plus_li)-1, 2):
        if plus_li[i] == 1 or plus_li[i+1] == 1:
            ans += (plus_li[i] + plus_li[i+1])
        else:
            ans += plus_li[i] * plus_li[i+1]
print(ans)

💡소요시간 : 17m

0개의 댓글