728x90
https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
입력을 받을 때 부터 조건문을 이용해 1일 경우는 그냥 answer에 더 해주고, 1보다 클 경우는 gt_arr에, 0과 음수는 lt_arr에 담아준다. 이때 1을 리스트에 넣지 않고 더해주는 이유는 1*n 과 1+n 중에 1+n이 더 크기 때문이다. 1의 경우는 곱셈을 하면 절대 최댓값이 나오지 않는다.
양수일 경우 내림차순으로 정렬, 음수일 경우는 오름차순으로 정렬해준다. 이는 큰 원소들끼리 먼저 곱해주기 위함인데, 음수는 절댓값이 클 수록 작으므로 오름차순, 양수는 절댓값이 클 수록 숫자도 커지므로 내림차순으로 정렬한다. 그 뒤, 리스트의 길이에 따라 for문을 돌며 두 수씩 곱한 뒤 더해준다.
# 양수 x 양수, 음수 x 음수
import sys
input = sys.stdin.readline
n = int(input())
gt_arr = []
lt_arr = []
answer = 0
for _ in range(n):
a = int(input())
if a == 1:
answer += 1
elif a > 1:
gt_arr.append(a)
else:
lt_arr.append(a)
gt_arr.sort(reverse=True)
lt_arr.sort()
if len(gt_arr) % 2 :
for idx in range(0, len(gt_arr)-1, 2):
answer += gt_arr[idx]*gt_arr[idx+1]
answer += gt_arr[-1]
else:
for idx in range(0, len(gt_arr), 2):
answer += gt_arr[idx]*gt_arr[idx+1]
if len(lt_arr) % 2:
for idx in range(0, len(lt_arr)-1, 2):
answer += lt_arr[idx]*lt_arr[idx+1]
answer += lt_arr[-1]
else:
for idx in range(0, len(lt_arr), 2):
answer += lt_arr[idx] * lt_arr[idx+1]
print(answer)
'알고리즘' 카테고리의 다른 글
[SWEA] 1248. 공통 조상 (0) | 2021.09.30 |
---|---|
[SWEA] 1240. 단순 2진 암호코드 (0) | 2021.09.29 |
[백준] 12904. A와 B (0) | 2021.09.28 |
[백준] 1541. 잃어버린 괄호 (0) | 2021.09.28 |
[SWEA] 1949. [모의 SW 역랑테스트] 등산로 조성 (0) | 2021.09.24 |