[백준] 2470번 : 두 용액 - JAVA

SUBNY·2023년 8월 28일
0

백준

목록 보기
20/22
post-thumbnail

백준문제캡쳐

(https://www.acmicpc.net/problem/2470)





접근 방법 🧐

반복문으로 용액을 하나씩 지정하면서 0에서 지정된 용액을 뺀값으로 이분탐색을 돌리려고 했다.
예제를 기준으로 설명하자면,
0-(-99) = 99니까 99를 탐색한다는 생각으로??
근데 코드가 안 짜지더라..

  • liq라는 배열을 오름차순으로 정렬해준다.

  • 0에 가장 가까운 특성값을 만드는 두 용액을 찾아야하니, 이를 확인하기 위한 check 값을 만들었다.
    check는 Integer.MAX_VALUE로 초기화해줌.

  • 0에 가깝다는 것은 특성값이 -1 과 1은 같게 여겨진다는 것 -> Math.abs
  • 0을 탐색한다는 느낌으로 접근.



내가 쓴 코드 ✍️

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] liq = new int[N];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++) {
			liq[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(liq);
		
		int check = Integer.MAX_VALUE;
		
		int answer1 = 0; // 출력할 때 특성값이 더 작은 용액
		int answer2 = 0; // 특성값이 더 큰 용액
		
			int low = 0;
			int high = N-1;
			
			while(low<high) {
				int sum = liq[low]+liq[high];
				
				if(Math.abs(sum)<check) { //0에 가까우니 절댓값으로 바꿔서 비교
					check = Math.abs(sum);
					answer1 = liq[low];
					answer2 = liq[high];
				}
				
				if(sum < 0) {
					low++; //음수 값이 크니까 왼쪽 포인터를 옮겨준다
				}
				else {
					high--; //양수 값이 크니까 오른쪽 포인터를 옮겨준다.
				}				
			}
		
		System.out.println(answer1+" "+answer2);
	}
}



내 제출

느낀점 📖

아래 코드는 while문 안의 조건문에
if(sum<0), else if(sum>0), else(sum==0일경우) 로 나눴고, else문에 break를 줬더니 시간초과가 났다.
생각해보면, sum=0이면 Math.abs(sum<check)를 비교하는 if문이 있으니 굳이 필요하진 않겠다.

profile
대체할 수 없는 풀스택 개발자가 되고 싶어요

0개의 댓글