문제 출저
https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
문제 풀이
용액의 양이 주어질 때 두 개를 섞어 0에 가까운 두 개의 용액을 찾는 것이 이 문제의 요구사항 입니다.
이 문제를 풀기 위해 투 포인터를 사용했습니다.
정렬된 배열에 처음(s)과 끝(e)으로 투 포인터가 시작됩니다.
두 개를 섞었을 때 0보다 크면 e-1 하여 값을 줄이고 0보다 작으면 s+1 하여 값을 키웁니다.
이것은 s가 e를 만날 기 전 까지 계속 반복합니다.
소스 코드
package baekjoon.backjoon9.day08;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/*
용액
https://www.acmicpc.net/problem/2467
*/
public class B2467 {
static int n;
static long[] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
board = new long[n];
for(int i = 0; i < n; i++) {
board[i] = Long.parseLong(st.nextToken());
}
int s = 0;
int e = n-1;
Arrays.sort(board);
// 투 포인터
long result = Long.MAX_VALUE;
long answer1 = 0;
long answer2 = 0;
while(s < e) {
long check = board[s] + board[e];
if(check == 0) {
answer1 = board[s];
answer2 = board[e];
break;
}
else if(check > 0) {
if (Math.abs(result) > Math.abs(check)) {
result = check;
answer1 = board[s];
answer2 = board[e];
}
e = e-1;
}
else if(check < 0) {
if (Math.abs(result) > Math.abs(check)) {
result = check;
answer1 = board[s];
answer2 = board[e];
}
s = s+1;
}
}
StringBuilder sb = new StringBuilder();
sb.append(answer1 + " " + answer2);
System.out.println(sb);
}
}