새소식

알고리즘 테스트 ⏲/백준

[백준] 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

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

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