https://www.acmicpc.net/problem/1744
1744번: 수 묶기
길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에
www.acmicpc.net
# -끼리 곱할수있으면 절대값이 클수록 이득 수를 절반으로 잘라야함
n = int(input())
nums = [int(input()) for _ in range(n)]
nums.sort(reverse =True)
plus = []
for i in nums :
if i >= 0 :
plus.append(i)
minus = []
for i in nums :
if i < 0 :
minus.append(i)
ex = 0
s = 0
zero = 0
if len(plus) > 0 :
for i in plus :
if i > 1 :
if ex == 0 :
ex = i
else :
s += ex * i
ex = 0
elif i == 1 :
s += 1
if i == 0 :
zero = 1
if ex != 0 :
s += ex
ex = 0
if len(minus) > 0 :
minus.sort()
for i in minus :
if i < 0 :
if ex == 0 :
ex = i
else :
s += ex * i
ex = 0
if ex != 0 :
if zero == 0 :
s += ex
ex = 0
print(s)
코드를 짧게 적으려면 짧게 적을 수 있는데 보기에는 이게 더 좋아서 일부러 코드를 길게 작성했다
이 문제의 핵심은 곱해서 얻는 숫자를 최대로 만들어야한다는 점이다
서로 곱하는 수가 최대가 될려면 양수는 양수끼리, 음수는 음수끼리 곱하고 절대값을 가장 큰 순서대로 서로 곱하면 된다
이를 위해 plus 리스트에는 0부터 양수만 저장, minus 리스트에는 0 미만의 수를 저장했다
이후 ex라는 변수를 만들어 ex가 0이라면 ex에 수를 저장, ex가 0이 아니라면
ex의 값과 i값을 곱한 수를 s에 저장했다
여기서 1은 무조건 더하게 만들었는데 이유는 1의 경우 어떤 수가 나와도 곱하는 것 보다 더하는 경우가 더 수가 커지기 때문이다
최종적으로 ex에 값이 남아있으면 ex의 값을 s 에 더하고 0으로 초기화 한다(숫자가 홀수 만큼 있는 경우 곱할 수 없기 때문)
0은 어차피 덧셈에 영향을 주지 않으므로 0이라는 숫자가 존재하는지만 따로 zero 라는 변수를 통해 체크했다
이후 음수를 sort로 정렬하고 정수의 경우와 같은 방법으로 계산한다
최종적으로 음수가 ex 에 하나 남아 있는 경우는 0이라는 숫자가 존재하지 않을 경우에만 s에 값을 더해준다
이유는 음수가 하나인 경우는 당연히 값의 마이너스가 될테니까 없애주는 것이다
'코딩 > 백준' 카테고리의 다른 글
백준 14916번 거스름돈 파이썬 코드 + 풀이 (0) | 2023.11.09 |
---|---|
백준 20300번 서강근육맨 반례 + 파이썬 코드 + 풀이 (1) | 2023.11.09 |
백준 1920번 수 찾기 파이썬 문제 풀이 (0) | 2023.11.04 |
백준 2839번 설탕 배달 파이썬 코드+풀이 (0) | 2023.11.04 |
백준 2579번 계단 오르기 파이썬 문제 풀이 + 팁 (1) | 2023.10.30 |