그리디 - 1744번: 수 묶기

jisu_log·2025년 8월 30일

알고리즘 문제풀이

목록 보기
91/105


  • 2 이상의 양수: 가장 큰 수부터 오름차순 정렬 순서대로 다음 숫자와 곱해서 더하기
  • 1: 전부 더해주기
  • 0 또는 음수: 가장 작은 수부터 오름차순 정렬 순서대로 다음 숫자와 곱해서 더하기
import sys

input = sys.stdin.readline

n = int(input())

plus_nums = []
other_nums = []
ones = 0

for i in range(n):
    line = int(input())
    if line == 1:
        ones += 1
    elif line > 1:
        plus_nums.append(line)
    else:
        other_nums.append(line)

# 순서대로 정렬하기
plus_nums.sort()
other_nums.sort()

# 최대 합
ans = 0

p_len = len(plus_nums)

# 양수는 맨 뒤에서부터 시작
i = p_len - 1

# 1) 양수 처리
while i >= 0:
    if i - 1 >= 0:
        ans += plus_nums[i] * plus_nums[i - 1]
        i -= 2
    else:
        ans += plus_nums[i]
        i -= 1

o_len = len(other_nums)

# 2) 1 처리 (전부 더해주기)
ans += ones


# 음수는 맨 앞에서부터 시작
i = 0

# 3) 0 또는 음수 처리
while i < o_len:
    # 뒤에 두 개 이상 남은 경우 곱해주기
    if i + 1 < o_len:
        ans += other_nums[i] * other_nums[i + 1]
        i += 2
    else:
        ans += other_nums[i]
        i += 1

print(ans)

0개의 댓글