카테고리 없음

[백준 java] 2473 세 용액

Lahezy 2022. 10. 12.
728x90

 

[문제링크] 자바 2473 세 용액

https://www.acmicpc.net/problem/2473

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

 

투 포인터를 이용하여 해결하였다.

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

댓글