. 섞고 섞고 돌리고 섞고 (백준 2470 : 두 용액)
본문 바로가기
프로그래밍 공부/백뚠

섞고 섞고 돌리고 섞고 (백준 2470 : 두 용액)

by 불냥이_ 2020. 12. 18.

2470번: 두 용액 (acmicpc.net)

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

 - 대전략:

요소를 오른차순으로 나열하고, 제일 작은 것은 min, 큰 것을 max로 하자. (min과 max는 인덱스 값이다.)

그리고 두개를 더했을 때, 음수면은 min을 한칸 위로 옮기고 양수면 max를 한칸 밑으로 내린다. 

min과 max를 더한 절대값 ( abs(sol[min] + sol[max]))이 제일 낮았을 때, min과 max을 저장하고, 양 합의 절댓값이 더 낮은 값을 경신하면 min max값을 갱신한다.

 

물론 0이 나오면 break한다.

 

시간초과날려나?

 

 

우선 값을 받고 sort한 후, 최소-최대 값을 뽑아내자.

n = int(sys.stdin.readline())
sol = list(map(int,sys.stdin.readline().split()))
sol.sort()

min_idx = 0
max_idx = n-1
new = abs(sol[0] + sol[n-1])
best_min = sol[min_idx]
best_max = sol[max_idx]
best_new = new

그리고 위의 절차를 실행할 함수를 만들자.

import sys

n = int(sys.stdin.readline())
sol = list(map(int,sys.stdin.readline().split()))
sol.sort()

min_idx = 0
max_idx = n-1
new = abs(sol[0] + sol[n-1])
best_min = sol[min_idx]
best_max = sol[max_idx]
best_new = new


def search():
    global min_idx, max_idx, best_min, best_max, new, best_new
    
    
    while abs(new) != 0:
        new = sol[min_idx] + sol[max_idx]
        if abs(new) < abs(best_new):
            best_min = sol[min_idx]
            best_max = sol[max_idx]
            best_new = new
            
        if new < 0:
            min_idx += 1
        else:
            max_idx -= 1
        
        
        
        if max_idx == min_idx:
            break

search() 
print(best_min, best_max)

이번엔 아주 깔끔하게 나왔다. 역시 쉽고 빠른 길을 택하는 것이 맞는가보다.

 

 

 

 

 

 

 

 

 

댓글