모눈종이에 사각사각
[백준 2470] 두 용액 본문
🍎[백준 2470] 두 용액
문제링크
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
⚾ 코드
n = int(input())
array = list(map(int, input().split()))
array.sort()
left, right, start, end = 0, n-1, 0, n-1
while left < right:
if abs(array[start]+array[end]) > abs(array[left]+array[right]): # 정답 갱신
start, end = left, right
# 다음으로 움직일 포인터 정하기
# 이동했을 때 0에 더 가까운 쪽으로 이동
if abs(array[left+1]+array[right]) > abs(array[left]+array[right-1]):
right -= 1
else:
left += 1
print(array[start], array[end])
🔔 해결 과정 & 깨달은 점
- 우선 0에 가까운 두 값을 구하므로, 정렬을 해서 양쪽에서 가운데로 다가오면서 비교를 해야 겠다고 생각했다.
- array를 정렬한다.
- left와 right를 각각 첫 번째 인덱스, 마지막 인덱스로 초기화한다.
- 반복문을 시작하는데, 조건은 left < right 일 때 까지이다.
- 처음에 left<=right라고 했더니, 같은 용액을 선택하는 경우가 발생했다. 서로 다른 두 용액을 섞어야 하므로, 같다는 조건은 제외해줘야 한다.
- 반복문을 돌면서, 정답(start, end)과 비교하여 0에 더 가까운 값이라면 갱신한다.
- 그리고 다음 움직일 포인터를 정한다.
- left를 1증가시켰을 때, 혹은 right를 1감소시켰을 때 0에 더 가까운 값으로 포인터를 움직인다.
- 위의 과정을 반복하면 정답이 나온다.
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준 15649] N과 M (1) (0) | 2022.06.27 |
---|---|
[백준 19637] IF문 좀 대신 써줘 (0) | 2022.06.12 |
[백준 20922] 겹치는 건 싫어 (0) | 2022.05.11 |
[백준 15686] 치킨 배달 (0) | 2022.04.21 |
[백준 1719] 택배 (0) | 2022.04.12 |
Comments