반응형
https://www.acmicpc.net/problem/2470
당장 어제만 해도 실버 5문제를 풀지 못해서 심란했는데 정답률 낮은 골드 5문제가 손쉽게 풀리는 것을 보니 코딩 테스트를 준비할 땐 회사의 유형에 맞게 준비해야 함을 느꼈다.
접근 방식
정렬한 후 투포인터를 사용했다. 맨 왼쪽에는 음수 or 가장 작은 값이고 오른쪽은 양수 or 가장 큰 값이니 두 값을 합쳐보고 0보다 작다면 왼쪽 값을 늘려서 0에 가깝게, 0보다 크다면 오른쪽 값을 줄여서 0에 가깝게 한다.
이렇게 구현하면 양수만 입력받을 때와 음수만 입력받을 때를 각각 구현할 필요 없다
잘한부분
문제 구현에 크게 어려운 부분은 없었다. 접근도 잘했고 0에 가까운 값을 구할 때 abs를 활용한 부분이 돋보였다.
부족한 부분
while문에서 left <= right문으로 설계했다가 틀린 원인을 찾지 못했었다. 이 문제를 계기로 투 포인터에서 <= 와 <의 차이를 좀 더 알게 됐다.
package backjon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[] arr;
static int max, resultA, resultB;
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());
}
Arrays.sort(arr);
max = Integer.MAX_VALUE;
int left = 0;
int right = N-1;
while(left < right) {
int sum = arr[left] + arr[right];
if(Math.abs(sum) < Math.abs(max)) { //0에서 가장 가까운 값을 구함
resultA = arr[left];
resultB = arr[right];
max = sum;
if(sum == 0) break; //없어도 시간에 큰 차이는 없다.
}
if(sum > 0) {
right--;
}else {
left++;
}
}
System.out.println(resultA + " " + resultB);
}
}
반응형
'알고리즘' 카테고리의 다른 글
백준 2108 자바 (0) | 2022.03.08 |
---|---|
백준 1436 자바 (0) | 2022.03.07 |
백준 1018 체스판 다시 칠하기 (0) | 2022.03.07 |
백준 2231 자바 (0) | 2022.03.05 |
백준 2636 치즈 자바 (0) | 2022.03.05 |