알고리즘문제풀이/백준
[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);
}
}