티스토리 뷰

728x90

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net


  • 해설 : 

수열 N이 주어질 때 이 수열의 합을 구하려고 한다. 이 때, 두 수를 위치에 상관없이 묶어 이 두 수는 곱해서 더할 수 있다고 한다. 이 조건에서 수열 합의 최댓값을 구하는 문제이다.

 

 

 


  • 풀이 :

쉬운 문제이다. 주어진 수열을 음수와 양수로 분리한 후 (0은 음수로, 1은 따로 카운팅) 

음수는 작은 값에서부터 2개씩 묶고 양수는 큰 값에서부터 2개씩 묶는다.

 

 

 

 


  • 소스코드 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
= int(input())
nums = []
for i in range(N):
    nums.append(int(input()))
negative=[]
positive=[]
ans=0
for num in nums:
    if num<=0:      #0도 negative의 원소로 둔다.
        negative.append(num)
    elif num==1:
        ans+=1      #숫자가 1인 경우에는 묶지 않으므로, 미리 계산하여 둔다.
    elif num>1:
        positive.append(num)
 
# 목적에 맞게 정렬
negative.sort()
positive.sort(reverse=True)
 
# 1) 작은 수부터 차례대로 묶는다.
for i in range(0,len(negative),2):
    if i+1 < len(negative):
        ans += negative[i]*negative[i+1]
    else:
        ans += negative[i]
 
# 2) 큰 수부터 차례대로 묶는다.
for i in range(0,len(positive),2):
    if i+1 < len(positive):
        ans += positive[i]*positive[i+1]
    else:
        ans += positive[i]
 
print(ans)
cs

 

320x100
댓글
© 2022 WonSeok, All rights reserved