반응형
Notice
Recent Posts
Recent Comments
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

UP

[백준 1744 : PYTHON] 수 묶기 본문

알고리즘/그리디

[백준 1744 : PYTHON] 수 묶기

cijbest 2020. 10. 23. 16:28

문제 풀기 : 1744번

 

1744번: 수 묶기

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

www.acmicpc.net

문제

길이가 N인 수열이 주어졌을 때, 수열의 두 수를 묶고 수열의 합을 구한다.

위치에 상관없이 수를 묶을 수 있다.

같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다.

묶은 수는 서로 곱한 후에 더한다.

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

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

수열의 각 수를 적절히 묶었을 때, 그 합의 최대를 구한다.

문제풀이

최적의 해를 구하는 그리디 문제이다.

이 문제는 양수와 음수, 0과 1을 생각해 주어야한다.

  • 양수의 경우 가장 큰 수를 기준으로 정렬하여 곱했을 때, 큰 값이 나온다.

  • 음수의 경우 가장 작은 수를 기준으로 정렬하여 곱했을 때, 큰 값이 나온다. (-3, -2, -1,.. 순)

  • 1은 무조건 더해주는 것이 수를 크게 만든다.

  • 0의 경우는 음수들을 다 묶고 남은 것이 있을 때 그 값을 더하게 되면 결과값이 작아지므로 마지막으로 남은 음수값을 0과 곱한다.

    • 남은 음수값과 0을 곱하기 위해선 0을 음수 데이터 배열에 넣어주면 된다. 가장 끝에 배치되므로 0이 남으면 더해지고 남는 음수값이 생기면 자동으로 곱해진다.

전체코드

# n : 데이터의 크기
n = int(input())

# plus : 양수 데이터 리스트, minus : 음수 데이터 리스트
plus = []
minus = []

result = 0
for i in range(n):
    num = int(input())
    if num > 1:
        plus.append(num)
    elif num <= 0:
        minus.append(num)
    else:
        result += num

# 정렬
plus.sort(reverse=True)
minus.sort() # ex) -3 -2 -1 

# 양수 묶기
for i in range(0, len(plus), 2):
    if i+1 >= len(plus):
        result += plus[i]
    else:
        result += (plus[i] * plus[i+1])

# 음수 묶기
for i in range(0, len(minus), 2):
    if i+1 >= len(minus):
        result += minus[i]
    else:
        result += (minus[i] * minus[i+1])

print(result)
반응형

'알고리즘 > 그리디' 카테고리의 다른 글

[프로그래머스 : PYTHON] 체육복  (0) 2021.05.11
[백준 1931 : PYTHON] 회의실 배정  (0) 2020.10.23
[백준 11399 : PYTHON] ATM  (0) 2020.10.20
[백준 1783 : PYTHON] 병든 나이트  (0) 2020.10.20
[백준 10610 : PYTHON] 30  (0) 2020.10.18
Comments