728x90
[문제링크] 자바 2473 세 용액
https://www.acmicpc.net/problem/2473
투 포인터를 이용하여 해결하였다.
3가지를 선택하는 경우를 전체 포문을 이용하여 0~n 까지를 기준으로 두고
정렬이 된 배열에서 left(왼쪽 포인트), right(오른쪽 포인트)를 이동하여 가장 작은 값을계산 하였다.(두 용액에서 했던방식과 같음)
만약 temp < 0 이면 left 를 증가시켜서 덜 감소되도록 하고 0 < temp 이면 덜 증가되도록 한다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
long arr[] = new long[num];
for (int i = 0; i < num; i++) arr[i] = Long.parseLong(st.nextToken());
Arrays.sort(arr); // 투포인터 사용하기 위해서 정렬
long min = Math.abs(arr[0] + arr[1] + arr[2]);
ArrayList<Long> minArr = new ArrayList(Arrays.asList(arr[0], arr[1], arr[2]));
for (int i = 0; i < num; i++) {
int point = i;
int left = 0, right = num - 1;
while (left < right && right < num) {
if (left == point || right == point) {
if (right == point) right--;
else left++;
continue;
}
long temp = arr[point] + arr[right] + arr[left];
if (Math.abs(temp) < min) {
min = Math.abs(temp);
minArr = new ArrayList(Arrays.asList(arr[point], arr[left], arr[right]));
//System.out.println(point+" "+minArr.get(0)+" "+minArr.get(1)+" "+minArr.get(2));
}
if (temp < 0) left++;
else right--;
}
}
Collections.sort(minArr);
System.out.println(minArr.get(0) + " " + minArr.get(1) + " " + minArr.get(2));
}
}
728x90
댓글