문제 : https://www.acmicpc.net/problem/2467

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

문제 요약 : 두 수를 합하여 0에 가장 가깝게 하는 두 수 출력

입력 출력
2 ≤ N(용액의 수) ≤ 100000
-1000000000 ≤ P(특성값) 1000000000
주어진 값들 중 2개를 합하여 0에 가장 가까운 두 수 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_2467.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
31115387 cbkpar 2467 맞았습니다!! 28348KB 360ms Java 11 809B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,i,l,r,m,t,tl,tr;
		n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(i=0;i<n;i++) arr[i] = Integer.parseInt(st.nextToken());
		Arrays.sort(arr);
		tl = l = 0;
		tr = r = n-1;
		m = Integer.MAX_VALUE;
		while(l<r) {
			t = arr[r]+arr[l];
			if(Math.abs(t)<m) {
				m = Math.abs(t);
				tl = l;
				tr = r;
			}
			if(t==0) break;
			if(t>0) r--;
			if(t<0) l++;
		}
		System.out.println(arr[tl]+" "+arr[tr]);
	}
}

용액의 특성 값을 오름차순 정렬한 뒤

왼쪽 끝과 오른쪽 끝에 포인터를 두고 두 값의 합을 확인한다.

합이 0일 경우 while문을 종료한다.

합이 양수 일경우 오른쪽 포인터를 한 칸 왼쪽으로 옮겨준다.

합이 음수 일경우 왼쪽 포인터를 한 칸 오른쪽으로 옮겨준다.

이 과정을 왼쪽포인터가 오른쪽 포인터보다 작을 때까지 반복해준다.

과정 중 두수 합의 절대값이 현재까지의 차이보다 작을 경우 위치를 기록해 놓는다.

과정 완료 후 저장해둔 포인터 위치에 해당하는 배열 값을 출력한다.

+ Recent posts