새소식

알고리즘 테스트 ⏲/백준

[백준] 2470. 두 용액 풀이 (Python, TypeScript)

  • -

 

 

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]);
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.