[백준/java] 2470. 두 용액

somyeong·2022년 9월 11일
0

코테 스터디

목록 보기
14/52

문제 링크 - https://www.acmicpc.net/problem/2470

🌱 문제


🌱 풀이

투포인터를 사용하여 푸는 문제이다.
배열을 오름차순 정렬 한 후, 양 끝 값을 두 용액으로 선택한다.
선택한 두 용액의 합이 절댓값이 최소값이면 min, answer1, answer2을 갱신하고 계속 진행한다.
두 용액의 합이 음수이면 start를 증가시키고, 두 용액의 합이 양수이면 end를 감소시킨다.
두 용액은 서로 다른 용액이어야 하므로 while(start<end) 범위에 주의한다.
그리고, if(sum==0) break; 조건이 없으면 시간초과가 났으므로, 주의 하자.


🌱 코드

package Sep_week02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

//2470. 두 용액 
public class boj_2470 {
	static int n;
	static int arr[];
	static int min=Integer.MAX_VALUE;
	static int answer1, answer2;
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n=Integer.parseInt(br.readLine());
		arr= new int[n];
		
		st=new StringTokenizer(br.readLine());
		for(int i=0; i<n; i++) {
			arr[i]=Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr); //오름차순 정렬 
		
		int start=0;
		int end=n-1;
		
		while(start<end) { //start==end이면 안되는것 주의 
			int sum=arr[start]+arr[end];
			
			if(Math.abs(sum)<min) { // 두 용액 합의 절댓값의 최솟값 갱신 
				min=Math.abs(sum);
				answer1=arr[start]; 
				answer2=arr[end];
			}
			
			if(sum==0) // 이부분 처리 안하면 시간초과 난다. 
				break;
			else if(sum>0) // 두 용액의 합이 양수면 end가 작아지는 방향으로 
				end--;
			else if(sum<0) // 두 용액의 합이 음수이면 start가 커지는 방향으로 
				start++;
		}
		System.out.println(answer1+" "+answer2);
	}
}

profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글