문제 : https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
문제 요약 : 두 수를 합하여 0에 가장 가깝게 하는 두 수 출력
| 입력 | 출력 |
| 2 ≤ N(용액의 수) ≤ 100000 -1000000000 ≤ P(특성값) ≤ 1000000000 |
주어진 값들 중 2개를 합하여 0에 가장 가까운 두 수 출력 |
JAVA
소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_2467.java
| 채점 번호 | 아이디 | 문제 번호 | 결과 | 메모리 | 시간 | 언어 | 코드 길이 |
| 31115387 | cbkpar | 2467 | 맞았습니다!! | 28348KB | 360ms | Java 11 | 809B |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,i,l,r,m,t,tl,tr;
n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(i=0;i<n;i++) arr[i] = Integer.parseInt(st.nextToken());
Arrays.sort(arr);
tl = l = 0;
tr = r = n-1;
m = Integer.MAX_VALUE;
while(l<r) {
t = arr[r]+arr[l];
if(Math.abs(t)<m) {
m = Math.abs(t);
tl = l;
tr = r;
}
if(t==0) break;
if(t>0) r--;
if(t<0) l++;
}
System.out.println(arr[tl]+" "+arr[tr]);
}
}
용액의 특성 값을 오름차순 정렬한 뒤
왼쪽 끝과 오른쪽 끝에 포인터를 두고 두 값의 합을 확인한다.
합이 0일 경우 while문을 종료한다.
합이 양수 일경우 오른쪽 포인터를 한 칸 왼쪽으로 옮겨준다.
합이 음수 일경우 왼쪽 포인터를 한 칸 오른쪽으로 옮겨준다.
이 과정을 왼쪽포인터가 오른쪽 포인터보다 작을 때까지 반복해준다.
과정 중 두수 합의 절대값이 현재까지의 차이보다 작을 경우 위치를 기록해 놓는다.
과정 완료 후 저장해둔 포인터 위치에 해당하는 배열 값을 출력한다.
'백준온라인' 카테고리의 다른 글
| [백준온라인] 20040번 사이클 게임 (0) | 2021.08.01 |
|---|---|
| [백준온라인] 9252번 LCS 2 (0) | 2021.07.31 |
| [백준온라인] 1248번 맞춰봐 (0) | 2021.07.29 |
| [백준온라인] 12018번 Yonsei TOTO (0) | 2021.07.28 |
| [백준온라인] 11441번 합 구하기 (0) | 2021.07.27 |