2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
접근한 방법
입력받은 용액들을 오름차순 정렬한 후 투 포인터로 해결할 수 있습니다.
포인터를 각각 배열의 왼쪽, 오른쪽 부분에서 시작하도록 설정하고 두 포인터가 엇갈리지 않을 때까지 포인터가 가리키는 각 배열의 값의 합의 최솟값을 갱신합니다. 값을 갱신할 때는 0에 수렴하는 값을 넣어줘야 하므로 절댓값으로 바꿔 넣어줍니다.
현재 순회중인 각 포인터가 가리키는 배열의 합이 0보다 큰 경우 오른쪽(큰 값)값을 줄여줘야 하므로 오른쪽 포인터를 감소하고 0보다 작으면 왼쪽 포인터를 증가합니다.
도중에 합이 0이 되거나 포인터가 엇갈린 경우에서의 배열의 두 값(result)이 0에 수렴하는 용액입니다.
Python
import sys
input = sys.stdin.readline
n = int(input())
arr = sorted(list(map(int, input().split())))
l, r = 0, n - 1
accr = sys.maxsize
result = []
while l != r:
now = arr[l] + arr[r]
p = abs(now)
if p < accr:
accr = p
result = [arr[l], arr[r]]
if now > 0:
r -= 1
elif now < 0:
l += 1
else:
break
print(*result)
TypeScript
function solution(n: number, arr: Array<number>) {
arr.sort((a, b) => a - b);
let [l, r, accr] = [0, n - 1, Number.MAX_SAFE_INTEGER];
let result;
while (l != r) {
const now = arr[l] + arr[r];
const p = Math.abs(now);
if (p < accr) {
accr = p;
result = [arr[l], arr[r]];
}
if (now > 0) r -= 1;
else if (now < 0) l += 1;
else break;
}
console.log(result);
}
solution(5, [-2, 4, -99, -1, 98]);
'알고리즘 테스트 ⏲ > 백준' 카테고리의 다른 글
[백준] 2589. 보물섬 풀이 (Python, TypeScript) (0) | 2023.08.17 |
---|---|
[백준] 2573. 빙산 풀이 (Python, TypeScript) (0) | 2023.07.27 |
[백준] 9251. LCS 풀이 (Python, TypeScript) (0) | 2023.07.17 |
[백준] 10026. 적록색약 풀이 (Python, JavaScript) (0) | 2023.07.13 |
[백준] 1339. 단어 수학 풀이 (Python, JavaScript) (0) | 2023.07.06 |