[파이썬, 자바] 백준 2470 : 두 용액 (골드5)
풀이
방향성 생각
- 투포인터 / 이분탐색인데 투포인터로 풀었다.
- 투포인터도 시작점에서 같이 시작하냐, 양 끝에서 조이냐 선택을 해야한다.
- window 내에서 개수나 합 등을 계속 측정해야하면 시작점에서 같이 시작해서 조건을 만족하는 최대 window 등을 찾으면 left pointer를 이동시킨다.
- 이 문제에서는 window의 길이와 관계 없이 양 끝 포인터의 합을 더해주면서 포인터를 조절해주면 된다.
파이썬
N = int(input())
arr = sorted(map(int,input().split()))
l,r = 0,N-1
min_sum = float('inf')
answer = None
while l < r:
temp = arr[l] + arr[r]
if abs(temp) < min_sum:
min_sum = abs(temp)
answer = (arr[l],arr[r])
if temp < 0:
l += 1
elif temp > 0:
r -= 1
else:
break
print(*answer)
자바
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int l=0, r = N-1;
int minSum = Integer.MAX_VALUE;
int[] answer = new int[2];
while (l<r) {
int temp = arr[l] + arr[r];
if (Math.abs(temp) < Math.abs(minSum)) {
minSum = temp;
answer[0] = arr[l];
answer[1] = arr[r];
}
if (temp < 0) {
l++;
} else if (temp > 0) {
r--;
} else {
break;
}
}
System.out.println(answer[0] + " " + answer[1]);
}
}
코멘트
- .
'Algorithm > etc' 카테고리의 다른 글
[자바] SWEA 6782 : 현주가 좋아하는 제곱근 놀이 (D5) (0) | 2025.03.09 |
---|---|
[파이썬] 백준 18809 : Gaaaaaaaaaarden (골드1) (0) | 2025.02.26 |
[파이썬, 자바] 백준 23848 : 등비수열의 합 (골드3) (0) | 2025.02.16 |
[파이썬, 자바] 백준 5549 : 행성탐사 (골드5) (0) | 2025.02.06 |
[파이썬, 자바] 백준 2167 : 2차원 배열의 합 (실버5) (0) | 2025.02.05 |
[파이썬] 백준 5800 : 성적 통계 (실버5) (0) | 2025.01.20 |
[파이썬] 백준 1644 : 소수의 연속합 (골드3) (0) | 2024.11.16 |
댓글