알고리즘문제풀이/백준

[BOJ]2473_세용액_Java

초보개발자.. 2021. 7. 11. 21:22

--문제--

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

 

2473번: 세 용액

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

www.acmicpc.net

--문제 접근--

이것 또한 2467번 문제의  용액과 비슷한데 이번엔 포인터를 3개를 늘려서 접근하는 문제였습니다.

하지만 문제를 풀면서 애를 먹은 게 당연스럽게 답을 구할 때에 int형으로 구하였는데 문제를 볼 때에 3개를 더하면 int형을 넘어서는 경우가 나와 답은 long형을 통해 구하도록 하였습니다.

접근방식은 2467의 방식과 비슷하고 하나를 고정한 이후에 용액의 방식을 그대로 재현하였습니다.

--용액의 접근방식--

용액의 수 N이 입력되고 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되니
생각 이난 것은 시작점을 지정하고 그 수와 비교되는 수를 끝에서부터 차근차근 내려오는 식으로 접근하면 어떨까? 에서 시작되었습니다.
이러한 과정을 진행하면서 temp가 ans보다 작다면 갱신하는 식으로 진행합니다.

package Class5;

import java.util.Arrays;
import java.util.Scanner;

public class BOJ_2473_세용액 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		long[] arr=new long[N];
		for(int i=0;i<N;i++) {
			arr[i]=sc.nextLong();
		}
		Arrays.sort(arr);
		long ans1 = 0,ans2=0,ans3=0;
		long ans=Long.MAX_VALUE;
		int start=0;
		while(start<N-1) {
			int start2=start+1;
			int end=N-1;
			while(start2<end) {
				long sum=arr[start]+arr[start2]+arr[end];
				if(ans>Math.abs(sum)) {
					ans=Math.abs(sum);
					ans1=arr[start];
					ans2=arr[start2];
					ans3=arr[end];
				}
				if(sum<0)start2++;
				else end--;
			}
			start++;
		}
		System.out.print(ans1+" "+ans2+" "+ans3);
	}
}