https://www.acmicpc.net/problem/1744
우선, 이 문제를 풀 때
양수,음수를 따로따로 받아줘야합니다.
'그냥 리스트에 한번에 담으면 안되나요?'
그렇게 담으면 묶을 때 많이 불편해집니다.
만약에
-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)
이 문제같은 경우에는
양수,음수를 따로 받는다는 아이디어가 생각나지 않는다면
좀 오래 해멜 수 있습니다.
이 문제를 통해서 숫자를 받을 때
따로 리스트를 저장할 수 있다는 걸
염두하면 좋을 것 같습니다.
[백준 129311번] 두 배 더하기(파이썬) (2) | 2022.07.19 |
---|---|
[백준 1967번] 트리의 지름(파이썬) (0) | 2022.07.18 |
[백준 11509번] 풍선 맞추기(파이썬) (0) | 2022.07.17 |
[백준 1092번] 배(파이썬) (1) | 2022.07.15 |
[백준 21315번] 카드 섞기(파이썬) (0) | 2022.07.13 |
댓글 영역