백준 2467 용액 [자바]
in Develop / Solving
baekjoon 2467 용액
java
문제 분석
- 산성과 알칼리를 나타내는 정수가 있음.
- 산성 1 ~ 10억
- 염기성 -10억 ~ -1
- 용액을 혼합하면, 각 용액 특성의 합으로 용액의 특성이 결정됨.
- 주어진 용액 중 두 개를 합쳐서, 0에 가까운 특성을 만들 수 있는 용액 두 개 선정 & 출력
입력조건
용액의 수 N
N개의 용액 특성
풀이과정
- 투포인터를 사용.
- 맨 처음 인덱스와 맨 끝 인덱스에 포인터를 두고, 이 둘을 더해서 초기 비교값을 만들고 시작.
- 정답 배열에 맨 왼쪽, 맨 오른쪽 것을 넣어두고,
- 두 포인터가 가리키는 값이 0에 가까워지는 방향으로 포인터를 이동시키며, 만약 현재 대조군보다 작은 값을 발견한다면, 대조군과 비교값을 변경.
위 과정을 두 포인터가 같은 위치에 올 때 까지 진행.
- 시간초과로 굉장히 애를 먹이는 문제ㅠㅠ
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Stream;
public class BJ2467_용액 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] nums = Stream.of(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[] ans = new int[2];
int l = 0;
int r = N-1;
int prop = Integer.MAX_VALUE;
while(l < r) {
int tmpprop = nums[l] + nums[r];
if(prop > Math.abs(tmpprop)) {
prop = Math.abs(tmpprop);
ans[0] = nums[l];
ans[1] = nums[r];
}
if (tmpprop < 0) l++;
else if(tmpprop > 0) r--;
else {
// 여기 들어오면, 그냥 출력하고 끝내도 됨.
System.out.println(nums[l] + " " + nums[r]);
return;
}
}
System.out.println(ans[0] + " " + ans[1]);
}
}