※ 문제
https://www.acmicpc.net/problem/1744
※ 문제 유형
그리디, 정렬, 많은 조건 분기(GOLD_4)
※ 나의 풀이
- 양수 리스트 [x > 0] (정렬), 0 리스트 [x == 0], 음수 리스트 [x < 0] (절댓값 큰 순서대로 정렬)
- 양수 리스트 계산
- 리스트 길이가 홀수 이면, 가장 작은 수를 ans에 더하고,
- 리스트 길이가 짝수 이면,
- i or i +1 의 요소가 1인 경우(1은 곱하는 것보다 더하는게 더 큰 값을 가진다) 모두 ans에 더하기
- i * i+1의 값을 ans에 더하기
- 음수 리스트 계산
- 리스트 길이가 홀수 and 0 리스트가 존재한다면, neg_idx += 1, 그렇지 않다면, 절댓값이 가장 작은 수를 ans에 더하기
- 리스트 길이가 짝수이면,
- i * i+1의 값을 ans에 더하기(음수 * 음수 = 양수)
import sys
N = int(sys.stdin.readline())
pos_arr = [] # 양수 x > 0
zero_arr = [] # 0
neg_arr = [] # 음수 x < 0
for i in range(N):
x = int(sys.stdin.readline())
if x > 0:
pos_arr.append(x)
elif x == 0: # x = 0
zero_arr.append(x)
else: # x < 0
neg_arr.append(x)
pos_arr.sort()
neg_arr.sort(reverse=True)
# print(pos_arr) # [1, 2, 3..]
# print(zero_arr) # [0, 0, 0..]
# print(neg_arr) # [-1, -2, -3..]
# 양수 리스트 계산 x > 0
ans = 0
pos_idx = 0
if len(pos_arr) % 2 != 0: # 양수 리스트가 홀수개 이면
ans += pos_arr[0]
pos_idx += 1
# print("pos_arr %2 != 0", ans)
for i in range(pos_idx, len(pos_arr)-1, 2):
if pos_arr[i] == 1 or pos_arr[i+1] == 1:
ans += pos_arr[i] + pos_arr[i+1]
i -= 1
# print("pos_arr elif", ans)
else:
ans += pos_arr[i] * pos_arr[i+1]
# print("pos_arr else", ans)
# 음수 리스트 계산 x < 0
neg_idx = 0
if len(neg_arr) % 2 != 0:
if len(zero_arr) > 0: # 양수 리스트가 홀수개 이면
# ans += neg_arr[0] * zero_arr[0] # 정렬된 음수 중 가장 큰 수 * 0 = 0
neg_idx += 1
# print("neg_arr %2 != 0 ", ans)
else:
ans += neg_arr[0]
neg_idx += 1
for i in range(neg_idx, len(neg_arr)-1, 2):
ans += neg_arr[i] * neg_arr[i+1]
# print("neg_arr loop", ans)
print(ans)
'CODING_TEST' 카테고리의 다른 글
[프로그래머스/Python] 기사단원의 무기 (0) | 2024.12.17 |
---|---|
[프로그래머스/Python] 추억 점수 (0) | 2024.12.17 |
[프로그래머스/Python] [1차] 비밀지도 (0) | 2024.12.16 |
[백준/Python] 2606. 바이러스 (0) | 2024.11.27 |
[백준/Python] 2910. 빈도 정렬 (1) | 2024.11.26 |