BOJ 1744 수 묶기

LONGNEW·2021년 1월 22일
0

BOJ

목록 보기
86/333

https://www.acmicpc.net/problem/1744
시간 2초, 메모리 128MB
input :

  • N(1 <= N <= 10,000)
  • 수(-10,000 <= 수 <= 10,000)

output :

  • 최대가 나오게 묶었을 때 합을 출력

조건 :

  • 수열의 두 수를 묶으려고 한다.
  • 위치에 상관없이 묶을 수 있다
  • {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 하지만, 2와 3을 묶고, 4와 5를 묶게 되면, 0+1+(23)+(45) = 27

정렬 각이 세게 보인다...

역시 조건이 많아질수록 틀리기 쉬운거 같다...
어차피 음수끼리 곱해야 하는 거 알았으면... 리스트 2개 만들어서 했으면 되는데 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ....... ㄲㅂ

일단 2가지 포인트를 놓쳤다.
1. 1은 더해주는 것이 크다.(차라리 1만 따로 세아려서 나중에 더해주자.)
2. 0은 음수와 곱해줄 때 숫자가 가장 커진다.(음수의 리스트에 0까지 추가해 버리자)

음수의 리스트는 오름차순으로 정렬을 시켜서 서로 곱할 때 가장 커진다..
가장 작은 음수끼리 곱하면 양수가 되기에 값이 커짐.. 0은 가장 작은 놈이랑 곱해야 함.

마지막으로. 양수와 음수를 곱할 때 for문 안에서 i + 1 번째가 리스트의 바깥인지에 대한 예외처리가 필요하다.

import sys

n = int(sys.stdin.readline())
positive = []
negative = []
one = 0
for i in range(n):
    data = int(sys.stdin.readline())
    if data > 1:
        positive.append(data)
    elif data <= 0:
        negative.append(data)
    else:
        one += 1

positive.sort(reverse=True)
negative.sort()

ans = 0
for i in range(0, len(positive), 2):
    if i + 1 < len(positive):
        ans += positive[i] * positive[i + 1]
    else:
        ans += positive[i]
for i in range(0, len(negative), 2):
    if i + 1 < len(negative):
        ans += negative[i] * negative[i + 1]
    else:
        ans += negative[i]


print(ans + one)

0개의 댓글