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)
이번엔 아주 깔끔하게 나왔다. 역시 쉽고 빠른 길을 택하는 것이 맞는가보다.
'프로그래밍 공부 > 백뚠' 카테고리의 다른 글
레이저 타워 디펜스 (백준 2493 : 탑) (0) | 2020.12.21 |
---|---|
색종이를 곱게 접어서 (백준 2630:색종이 만들기) (0) | 2020.12.18 |
아~ 와이파이 잘되는 집을 찾으시는구나? (백준 2110 : 공유기 설치) (0) | 2020.12.18 |
나무를 자르다니 나무해 (백준 2805:나무자르기) (0) | 2020.12.18 |
야구는 9회말 2아웃부터 (백준2053:숫자야구) (0) | 2020.12.17 |
댓글