[백준 1744] 수 묶기

Junyoung Park·2022년 3월 6일
0

코딩테스트

목록 보기
203/631
post-thumbnail

1. 문제 설명

수 묶기

2. 문제 분석

두 개씩 묶었을 때 가장 이득이 되는 경우는 양수는 큰 수대로 정렬, 음수는 작은 수대로 정렬해서 앞에서 두 개씩 묶는 것이다.

  • 이때 양수는 주의할 점이 1은 묶는 것보다 더하는 게 이득이라는 점이다. 물론 -1과 같은 경우는 덧셈이 곧 뺄셈이기 때문에 신경쓸 필요가 없다. 또한 두 개씩 묶기 때문에 꺼낸 뒤 리스트에 남아 있는 수가 없는지 체크해야 하고, 만일 0이 있다면 한 개짜리 음수(무조건적으로 빼주어야 하는 수)는 무시할 수 있다는 점을 확인하자.

3. 나의 풀이

import sys

n = int(sys.stdin.readline().rstrip())
numbers = []

for _ in range(n):
    numbers.append(int(sys.stdin.readline().rstrip()))

numbers.sort(reverse=True)

total = 0
zero_in = False
re_check = False

while len(numbers) >= 2:
    # 양수를 큰 순서대로 두 개씩 묶는다.
    num1 = numbers.pop(0)
    num2 = numbers.pop(0)

    if num1 <= 0 or num2 <= 0:
        # 양수가 아닌 수가 섞여 있다면 break
        re_check = True
        break

    if num1 == 1 or num2 == 1:
        # 1은 곱하면 같은 수가 되므로 덧셈이 이득
        total += num1 + num2
    else:
        total += num1 * num2

if re_check:
    # num1, num2은 체크하지 않은 상태로 break했기 때문에 다시 한 번 확인.
    if num1 > 0: total += num1
    elif num1 == 0: zero_in = True
    else: numbers.append(num1)
    
    if num2 == 0: zero_in = True
    else: numbers.append(num2)
    # 0는 더하고, 0은 따로 표시해준다. 음수는 다시 push
    
numbers.sort()
# 음수 곱은 양수. 곱했을 때 큰 수가 나오도록 오름차순 정렬

while len(numbers) >= 2:
    # num들은 음수 보장
    num1 = numbers.pop(0)
    num2 = numbers.pop(0)

    total += num1 * num2

if not zero_in and numbers:
    # 주어진 number에 0이 없다면 음수를 더해야 한다.
    num = numbers.pop(0)
    total += num
# 0이 있다면 남아 있는 음수는 무시해도 된다.

print(total)
profile
JUST DO IT

0개의 댓글