프로그래밍/Algorithm

백준 수 묶기 파이썬

모지사바하 2021. 2. 20. 15:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# https://www.acmicpc.net/problem/1744
 
= int(input())
= [int(input()) for _ in range(N)]
 
# 1보다 큰수 배열 생성 내림차순으로 정렬 (plusA)
# 0보다 작은수 배열 생성 오름차순으로 정렬 (minusA) - 음수는 오름차순으로 정렬하는 이유는 더 작은수 끼리 곱해야 더 큰수가 되기 때문이다. 예를들면 -2 * -3 = 6 이지만 -10 * -9 = 90 이다.
# 0, 1 은 기타 배열 (etc)
 
# plusA 배열 2개씩 짝지어서 곱하여 누적 > plusA 배열의 길이가 홀수면 배열의 마지막 원소는 결과(result)에 누적
# minusA 배열 2개씩 짝지어서 곱하여 누적 > minusA 배열의 길이가 홀수면 배열의 마지막 원소를 조건에 따라 결과(result)에 누적할지 말지 결정 - 조건은 아래주석 참고
# 기타 배열(etc)에 0 이 있다면, 음수가 홀수인 경우, 기타 배열의 0과 minusA 의 마지막 원소를 짝지어서 곱하면 0으로 만들어버릴 수 있기 때문에 누적하지말고 무시해야한다.
 
minusA = list(filter(lambda x: x < 0, A))
minusA.sort()
 
plusA = list(filter(lambda x: x > 1, A))
plusA.sort(reverse=True)
 
# 0, 1은 전부 기타배열로 넣어준다 1은 무조건 더할거기때문.
etc = list(filter(lambda x: x == 1 or x == 0, A))
 
result = 0
for i in range(0len(plusA)-12):
  result+=plusA[i] * plusA[i+1]
if len(plusA) % 2 == 1:
  result+=plusA[-1]
 
for i in range(0len(minusA)-12):
  result+=minusA[i] * minusA[i+1]
if len(minusA) % 2 == 1:
  if 0 not in etc:
    result+=minusA[-1]
 
result+=sum(etc)
 
print(result)
 
cs

 

기본 알고리즘은 빠르게 구현했으나,

음수 배열 리스트가 홀수 일 때, 나머지에 0이 있는 경우에 무시하는 경우를 생각하지 못해 꽤 많이 틀렸다.

 

머리로만 생각하지말고 써보자.. 그러면 좀 더 많은 경우가 보이겠지.