[백준] 2470: 두 용액 - Java (Two Pointer)
Algorithm/BackJun 2024. 3. 30.
목 차
- 문제
- 접근 방식
- 풀이
문제
접근 방식
이 문제는 투 포인터를 활용하여 알고리즘을 구현하는 문제이다.
투포인터의 특성상 대부분의 문제가 정렬을 요구하는데, 자바에서는 Arrays.sort(배열)를 사용하면 쉽게 정렬을 할 수 있다. 우리의 요점은 정렬이 아닌 투 포인터 기법이니 가볍게 넘어가기로 했다.
왼쪽과 오른쪽에 포인터를 하나씩 놔두고 조건에 따라 각각 한 칸씩 오른쪽과 왼쪽으로 이동하게 한다.
먼저 다음과 같이 구현순서를 정의했다.
1. 두 포인터가 가리키는 값의 합을 더한다. (sum = arr[left] + arr[right])
2. 이전까지 가장 가까웠던 거리의 크기와 현재 거리의 크기를 비교한다.
2 - 1. 현재 거리의 크기가 더 작다면 값을 갱신해준다.
2 - 2. 현재 거리의 크기가 더 크다면 그냥 넘어간다.
3. 더한 값 확인
3 - 1. 더한 값이 0 보다 크다면 오른쪽 포인터를 왼쪽으로 한 칸 이동.
3 - 2. 더한 값이 0 보다 작다면 왼쪽 포인터를 오른쪽으로 한 칸 이동.
이렇게 구현하면 빠르게 문제를 풀 수 있다.
풀이
package src.TwoPointer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class 두용액_2470 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int left = 0;
int right = n - 1;
int value_l = 0;
int value_r = 0;
int result = Integer.MAX_VALUE;
while(left < right){
int sum = arr[left] + arr[right];
if(Math.abs(result) > Math.abs(sum)){
result = sum;
value_l = arr[left];
value_r = arr[right];
}
if(sum > 0){
right --;
} else {
left ++;
}
}
StringBuilder sb = new StringBuilder();
if(value_l >= value_r){
sb.append(value_r).append(" ").append(value_l);
} else {
sb.append(value_l).append(" ").append(value_r);
}
System.out.println(sb);
}
}
'Algorithm > BackJun' 카테고리의 다른 글
[백준] 1707: 이분 그래프 - Java (그래프 알고리즘) (0) | 2024.05.15 |
---|---|
[백준] 2448: 별찍기 11 - Java (RecursiveFunction) (0) | 2024.03.30 |
[백준] 10282: 해킹 - Java (Dijkstra) (0) | 2024.03.29 |
[백준] 2109: 순회강연 - Java (우선순위 큐) (0) | 2024.02.15 |
[백준] 7576: 토마토 - Java (그래프) (0) | 2024.01.23 |