1 분 소요

1. 문제

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

  • 정렬, 구현 문제
// 문제
길이가 N인 수열이 주어졌을 ,  수열의 합을 구하려고 한다. 
하지만, 그냥  수열의 합을 모두 더해서 구하는 것이 아니라, 
수열의  수를 묶으려고 한다. 
어떤 수를 묶으려고  , 위치에 상관없이 묶을  있다. 
하지만, 같은 위치에 있는 (자기 자신) 묶는 것은 불가능하다. 
그리고 어떤 수를 묶게 되면, 
수열의 합을 구할  묶은 수는 서로 곱한 후에 더한다.

예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5} , 
그냥  수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 
하지만, 2 3 묶고, 4 5 묶게 되면, 
0+1+(2*3)+(4*5) = 27 되어 최대가 된다.

수열의 모든 수는  한번만 묶거나, 아니면 묶지 않아야한다.

수열이 주어졌을 , 수열의  수를 적절히 묶었을 , 
 합이 최대가 되게 하는 프로그램을 작성하시오.

// 입력
첫째 줄에 수열의 크기 N이 주어진다. N은 50보다 작은 자연수이다. 
둘째 줄부터 N개의 줄에 수열의  수가 주어진다. 
수열의 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

// 출력
수를 합이 최대가 나오게 묶었을  합을 출력한다. 
정답은 항상 231보다 작다.

// 예제 입력 1 
4
-1
2
1
3

// 예제 출력 1 
6

// 예제 입력 2 
6
0
1
2
4
3
5

// 예제 출력 2 
27

// 예제 입력 3 
1
-1

// 예제 출력 3 
-1

// 예제 입력 4 
3
-1
0
1

// 예제 출력 4 
1

// 예제 입력 5 
2
1
1

// 예제 출력 5 
2


2. 핵심 아이디어


3. Python 문제풀이

import sys
input = sys.stdin.readline

N = int(input())
positive  = []
negative = []
ms = 0

for _ in range(N) :
  n = int(input())
  
  if n > 1 :
    positive.append(n)
  elif n == 1 :
    ms += 1
  else :
    negative.append(n)

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

if len(positive) % 2 == 0 :
  for i in range(0, len(positive), 2) :
    ms += positive[i] * positive[i+1]
else :
  for i in range(0, len(positive)-1, 2) : 
    ms += positive[i] * positive[i+1]
  ms += positive[len(positive)-1]

if len(negative) % 2 == 0 :
  for i in range(0, len(negative), 2) :
    ms += negative[i] * negative[i+1]
else :
  for i in range(0, len(negative)-1, 2) :
    ms += negative[i] * negative[i+1]
  ms += negative[len(negative)-1]

print(ms)


4. Java 문제풀이


댓글남기기