728x90
해당 문제는 투 포인터 알고리즘으로 해결하였습니다.
두 용액의 합이 0과 가장 근사한 한 쌍을 찾아야 하는 문제입니다.
입력받은 용액의 배열을 정렬을 시키고
왼쪽 인덱스의 값과 오른쪽 인덱스의 값을 더해서
절댓값이 minValue보다 작으면 출력 값(ans1, ans2)과 minValue를 업데이트합니다.
만약 minValue가 0이면 ans1과 ans2를 출력시키고 return 해줍니다.
왼쪽 인덱스의 값과 오른쪽 인덱스의 값의 합(sum)이 0보다 작으면
왼쪽 인덱스를 1 증가시키고,
그 반대면 오른쪽 인덱스를 1 감소시킵니다.
while문이 종료되면 ans1, ans2를 출력시키고 종료합니다.
파이썬 풀이 및 해설
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N;
static int [] arr;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int i=0; i<N ; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
twoPointer(arr,N);
}
public static void twoPointer(int [] arr,int N){
Arrays.sort(arr);
int left=0,right= N-1,minValue = Integer.MAX_VALUE;
int ans1= 0,ans2 = Integer.MAX_VALUE;
while(left < right){
int sum = arr[left] + arr[right];
if(Math.abs(sum) < minValue){
ans1 = arr[left];
ans2 = arr[right];
minValue = Math.abs(sum);
}
if(minValue == 0) {
System.out.printf("%d %d",ans1,ans2);
return;
} else if (sum < 0) {
left += 1;
}else {
right -= 1;
}
}
System.out.printf("%d %d",ans1,ans2);
return;
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA][백준 8980][그리디, 정렬] 택배 - 컴도리돌이 (0) | 2022.08.16 |
---|---|
[JAVA][백준 17845][배낭문제] 수강 과목 - 컴도리돌이 (0) | 2022.08.02 |
[JAVA][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열2 - 컴도리돌이 (0) | 2022.07.30 |
[JAVA][백준 2122][그리디 정렬] 센서 - 컴도리돌이 (0) | 2022.07.27 |
[JAVA][백준 20437][문자열] 문자열 게임 2 - 컴도리돌이 (0) | 2022.07.25 |