Jun's Development Journey
[BOJ] 2470번 두 용액 본문
문제
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
풀이
- 풀이 중점 -
1) 정렬부터 한다.
2) front와 rear가 가리키는 값의 합의 절대값과 min 값을 비교하고, min 및 left, right 값을 갱신한다.
3) front + rear 값이 양수이면(rear값의 절대값이 더 큰 경우) 값을 줄여야 하니 rear값을 감소, 음수이면(rear 절대값이 더 작은 경우, 즉 둘 다 음수 인 경우) front를 증가시켜준다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
import java.util.StringTokenizer;
import java.util.Map.*;
public class BOJ_2470 {
static int N;
static long min = Long.MAX_VALUE;
static long[] samples;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
N = Integer.parseInt(br.readLine());
samples = new long[N];
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++)
samples[i] = Long.parseLong(st.nextToken());
Arrays.sort(samples);
int front=0, rear = N-1, left=-1,right=-1;
while(front<rear){
long sum = samples[front]+samples[rear];
if(Math.abs(sum) < min){
min = Math.abs(sum);
left = front;
right = rear;
}
if(sum>0)
rear--;
else
front++;
}
System.out.println(samples[left]+" "+samples[right]);
System.out.println(min);
}
}
'BOJ > Two Pointer' 카테고리의 다른 글
[BOJ] 17609 회문 (0) | 2021.03.03 |
---|---|
[BOJ] 6159 코스튬 파티 (0) | 2021.02.23 |
[BOJ] 2531 회전초밥 (0) | 2021.02.22 |