몽상실현개발주의

[BOJ] 1744 / 수 묶기 / Python 파이썬 본문

Algorithm PS/BOJ

[BOJ] 1744 / 수 묶기 / Python 파이썬

migrationArc 2021. 7. 7. 09:30

[BOJ] 1744 / 수 묶기 / Python 파이썬

[BOJ] 1744 / 수 묶기 / Python 파이썬

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

 

1744번: 수 묶기

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

www.acmicpc.net

 

풀이

양수, 1, 0, 음의 정수에 대해 구분하여 계산해 주는 문제이다.

 

수열의 두 수를 묶어 최대값을 만들기 위해 다음과 같은 로직을 세웠다.

  1. 수열이 양수인 경우: 큰 수 부터 2개씩 묶어 곱하기
  2. 양수에 1이 포함 된 경우: 곱했을 경우 보다 더했을 경우가 더 큰 수가 된다.
  3. 수열이 음수인 경우: 작은 수 부터 2개씩 묶어 곱하기
  4. 0: 음수에 포함시켜 묶어주면, 음수 하나를 제거 할 수 있다.

 

 

import sys
input = sys.stdin.readline

N = int(input())

nums_p = []
nums_m = []

for _ in range(N):
    tmp = int(input())
    if tmp > 0:
        nums_p.append(tmp)
    else:
        nums_m.append(tmp)

nums_p.sort(reverse=True)
res = 0
for i in range(len(nums_p)//2):
    if nums_p[(i*2)+1] == 1:
        res += nums_p[i*2]
        res += nums_p[(i*2)+1]
    else:
        res += nums_p[i*2] * nums_p[(i*2)+1]
if len(nums_p) % 2:
    res += nums_p[-1]

nums_m.sort()
for i in range(len(nums_m)//2):
    res += nums_m[i*2] * nums_m[(i*2)+1]
if len(nums_m) % 2:
    res += nums_m[-1]

print(res)

※ 1 의 경우를 생각하지 못하여 헤매었다.

 

 

 


참고 블로그

https://velog.io/@sch804/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B0%B1%EC%A4%80-1744%EB%B2%88-%EC%88%98-%EB%AC%B6%EA%B8%B0

 

파이썬 백준 1744번 수 묶기

백준 1744번이 문제는 두 개의 수를 묶든지 말든지해서 곱하여 더해서 최대의 값을 만드는 것이다. 나는 이 문제를 풀기 위해 케이스 분류를 하였다.1보다 클경우 :1보다 큰수를 큰 순으로 정렬하

velog.io

 

Comments