728x90
문제
홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데,
같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다.
당신은 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 하는데, 각 용액은 10ml시험관에 10ml씩 들어있고, 빈 20ml 시험관이 단 하나 있다. 게다가 용액을 계량할 수 없어서, 두 용액을 섞을 때는 10ml씩 섞어서 20ml로 만드는데, 단 한번밖에 할 수 없다. 그래서 미리 용액의 특성값들을 보고, 어떤 두 용액을 섞을 것인지 정해야 한다.
예를 들어, 연구소에 있는 용액들의 특성값이 [-101, -3, -1, 5, 93]이라고 하자. 이 경우에 특성 값이 각각 -101, 93인 용액을 혼합하면 -8인 용액을 만들 수 있다. 또한 특성값이 5인 용액과 93인 용액을 혼합하면 특성 값이 98인 용액을 만들 수 있다. 모든 가능한 조합을 생각해 보면, 특성값이 2인 용액이 0에 가장 가까운 용액이다.
용액들의 특성값 A1, … ,AN이 오름차순으로 주어졌을 때, 이 중 두 개의 용액을 혼합하여 만들 수 있는 0에 가장 가까운 특성값 B를 출력하시오.
입력
N
A1 A2 … AN
출력
B
해결 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[]solution = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int val = Integer.MAX_VALUE;
int l = 0;
int r = N-1;
//투포인터를 이용해 0의 합 중 가장 작은 것 탐색
while(l<r){
int sum = solution[l] + solution[r];
//기존 값과 현재 합 중 0이 가까운 것을 선택
val = Math.min(Math.abs(val),Math.abs(sum)) == Math.abs(val) ? val : sum;
if(sum == 0){
break;
}else if(sum < 0){
l++;
}else{
r--;
}
}
System.out.println(val);
}
}
실행 결과

팁
- 두 수의 합은 두 포인터로 해결할 수 있다.
'알고리즘 문제 풀이 > 해결코드' 카테고리의 다른 글
[백준 - 14550[GOLD 5][해설 X] - 마리오 파티 (JAVA) (2) | 2024.06.11 |
---|---|
[백준 - 3649[GOLD 5][해설 X] - 로봇 프로젝트 (JAVA) (0) | 2024.06.07 |
[백준 - 9024][GOLD 5][해설 X] - 두 수의 합 (JAVA) (0) | 2024.06.05 |
[백준 - 2262][GOLD 4][해설 X] - 토너먼트 만들기 (JAVA) (0) | 2024.06.05 |
[백준 - 15922][GOLD 5][해설 X] - 아우으 우아으이야!! (JAVA) (1) | 2024.06.03 |