상세 컨텐츠

본문 제목

[백준 1744번] 수 묶기(파이썬)

알고리즘 공부

by Tabris4547 2022. 7. 17. 20:58

본문

728x90

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

 

1744번: 수 묶기

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

www.acmicpc.net

우선, 이 문제를 풀 때

양수,음수를 따로따로 받아줘야합니다.

'그냥 리스트에 한번에 담으면 안되나요?'

그렇게 담으면 묶을 때 많이 불편해집니다.

만약에

-5 -3 0 0 0 0 0 1 2 3 4

이렇게 리스트가 주어져있다고 할 때

묶는 게 좀 많이 남감하겠죠?

그러니 양수 음수를 따로 받아주고

0의 갯수는 따로 저장해줍니다.

그 다음 절대값을 기준으로 정렬해줍니다.

양수는 sort(reverse=True)해주면 되고

음수는 sort()해주면 됩니다.

(sort()로하면 작은 수 순서대로 정렬되는데

음수에서는 절대값이 클 수록 작은 수가 되므로

절대값 순서대로 정렬이 됩니다.)

그 다음에는 절댓값을 기준으로

크게크게 만들기 위해서

두 개씩 묶어주면 끝.

 

#백준 1744 수 묶기

N=int(input())
pos=[]
neg=[]
zero=0
#양수,음수를 각각 따로 받아줘서 합을 구한다
for _ in range(N):
    n=int(input())
    if n>0:
        pos.append(n)
    elif n<0:
        neg.append(n)
    else:
        zero+=1
pos.sort(reverse=True)
neg.sort()

answer=0
while pos:
    if len(pos)>=2:
        a=pos.pop(0)
        b=pos.pop(0)
        #둘 중 하나가 1이라면, 그냥 둘을 더하는 게 더 좋다
        if a==1 or b==1:
            hap=a+b
        else:
            hap=a*b

    else:
        a=pos.pop(0)
        hap=a

    answer+=hap

while neg:
    #작은 순서대로 정렬했다.
    #예를들면 -5 -4 -3 -2 -1 이런 순으로
    #절대값이 큰 걸 먼저 묶어주면서 합을 크게 한다
    if len(neg)>=2:
        a=neg.pop(0)
        b=neg.pop(0)
    else:
        a=neg.pop(0)
        b=1
        #만약 0이 남아있다면 0과 함께 묶어준다.
        if zero>0:
            b=0
            zero-=1

    answer+=a*b


print(answer)

 

이 문제같은 경우에는

양수,음수를 따로 받는다는 아이디어가 생각나지 않는다면

좀 오래 해멜 수 있습니다.

이 문제를 통해서 숫자를 받을 때

따로 리스트를 저장할 수 있다는 걸

염두하면 좋을 것 같습니다.

728x90

관련글 더보기

댓글 영역