Algorithm/알고리즘 문제

[백준/BOJ][Python] 1744번 수 묶기

은 딩 2023. 11. 30. 01:06

[백준/BOJ][Python] 1744번 수 묶기

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

 

1744번: 수 묶기

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

www.acmicpc.net

 


아이디어

양수는 내림차순, 음수는 오름차순으로 정렬하고

1이면 그냥 더하기, 음수가 짝수개이면 음수끼리 곱해서 더하기, 음수가 홀수개인데 0이 있으면 0 곱해서 더하기

그리고 리스트에서 이미 더한거는 1002로 처리

이런식으로 경우의 수를 모두 생각해서 풀었다!(정답코드1)

 

근데 더 쉬운 풀이가 있어서 다른 방법으로도 풀어봤다!!(정답코드2)

 


코드

 

정답 1

# 정답 코드 1
import sys
input = sys.stdin.readline

n = int(input())
arr = []
positive = []
negative = []
zero = False

arr = positive + negative
for _ in range(n):
    a = int(input())
    if a == 0: zero = True
    if a >= 0:
        positive.append(a)
    else:
        negative.append(a)
positive.sort(reverse=True)
negative.sort()
arr = positive + negative



result = 0
for i in range(n-1):
    if arr[i] > 0 and arr[i] < 1002: # 양수
        if arr[i+1] > 1 :
            result += (arr[i]*arr[i+1])
            arr[i], arr[i+1] = 1002, 1002
        else:
            result += arr[i]
            arr[i] = 1002

    elif arr[i] <= 0 and zero == False : # 음수
        if arr[i+1] < 0:
            result += (arr[i] * arr[i + 1])
            arr[i], arr[i + 1] = 1002, 1002

        else:
            result += arr[i]
            arr[i] = 0

    elif zero and arr[i] < 0:
        if arr[i+1] < 0:
            result += (arr[i] * arr[i + 1])
            arr[i], arr[i + 1] = 1002, 1002


if arr[-1] != 1002 and zero==False:
    print(result+arr[-1])
else:
    print(result)

 

 

정답2)

# 정답 코드 1
import sys
input = sys.stdin.readline

n = int(input())
positive_arr = []
negative_arr = [] # 0은 여기에 넣을 예정
result = 0

for _ in range(n):
    a = int(input())
    if a <= 0:
        negative_arr.append(a)
    elif a == 1: # 1이면 그냥 더하기
        result += 1
    else:
        positive_arr.append(a)

negative_arr.sort() # 음수는 오름차순
positive_arr.sort(reverse=True) # 양수는 내림차순

if len(positive_arr) %2 != 0:
    positive_arr.append(1)
if len(negative_arr)%2 != 0:
    negative_arr.append(1)

for i in range(0, len(positive_arr), 2):
    result += (positive_arr[i]*positive_arr[i+1])
for i in range(0, len(negative_arr), 2):
    result += (negative_arr[i]*negative_arr[i+1])
print(result)

이 코드가 조금 더 간결해보인다.

 

1은 어차피 곱해줘도 똑같으니 바로 더하고 리스트에 넣진 않는다.

코드1처럼 음수는 오름차순, 양수는 내림차순으로 정렬한다. 이때 0은 음수 리스트에 넣었다.

그 이유는 음수가 홀수개면 0을 곱해서 없애버리기 위해서이다

양수나 음수리스트가 홀수개이면 각 리스트 맨 뒤에 1을 넣는다.(어차피 1은 곱하나마나 똑같으니)

그리고 값 두 개를 곱해가면서 result에 더해준다!

그럼 끝!

 

 

 

두 코드를 비교해보면 메모리, 시간측면에서는 똑같다 걍 코드 길이 차이인듯

둘 다 O(n)