알고리즘

[백준] 1744. 수 묶기

담쏙 2021. 9. 29. 02:27
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