2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
0. 두 포인터 문제
1. 두 포인터 사용을 위해 전체 입력값을 정렬해준다
- Arrays.sort는 최악 N제곱으로 나오는 함수이므로, Collections.sort를 이용했다
2. 양 끝 값을 초기 포인터로, 두 값의 차이를 초기 합(min)로 지정한다
3. 현재 포인터가 가리키는 용액의 합이 현재 min보다 작다면, 새로운 min으로 지정하고 포인터를 저장한다
4. 현재 포인터 용액의 합이 양수라면 + 용액이 약해져야하고, 음수라면 - 용액이 약해져야한다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = pint(br.readLine());
ArrayList<Integer> num = new ArrayList<>(N);
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
num.add(pint(st.nextToken()));
}
Collections.sort(num);
int fst=0, snd=N-1;
int min = Math.abs( num.get(fst)+num.get(snd) );
int minMinus=num.get(fst), minPlus=num.get(snd);
while(fst<snd) {
int cur = num.get(fst)+num.get(snd);
if(Math.abs(cur)<min) {
min = Math.abs(cur);
minMinus=num.get(fst); minPlus=num.get(snd);
}
if(cur<0) {
fst++;//- 용액 약화
}
else {
snd--;//+ 용액 약화
}
}
System.out.println(minMinus+" "+minPlus);
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글
[백준] 2668 - 숫자 고르기 (0) | 2021.11.27 |
---|---|
[백준] 4485 - 녹색 옷 입은 애가 젤다지? (0) | 2021.11.26 |
[백준] 11758 - CCW (0) | 2021.11.15 |
[백준] 2631 - 줄세우기 (0) | 2021.11.15 |
[백준] 1959 - 달팽이3 (0) | 2021.11.04 |
[백준] 16973 - 직사각형 탈출 (0) | 2021.11.04 |
[백준] 23288 - 주사위 굴리기 2 (0) | 2021.11.03 |