본문 바로가기
항해

[DAY41] 99클럽 코딩테스트 JAVA 백준 두 용색 2470번

by neVerThe1ess 2025. 1. 17.

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


🌘 문제 이해하기 

  • 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. (그 용액의 특성을 나타내는 하나의 정수가 주어져있다.)
  • 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 
    알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다.
  •  연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다.
  • 산성 용액과 알칼리성 용액의 특성값이 주어졌을 때, 이 중 두 개의 서로 다른 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액을 찾아라
  • 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다.
  • 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. (이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하이다.)
  • N개의 용액들의 특성값은 모두 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.
  • 출력해야 하는 두 용액은 특성값의 오름차순으로 출력한다. 
  • 특성값이 0에 가장 가까운 용액을 만들어내는 경우가 두 개 이상일 경우에는 그 중 아무것이나 하나를 출력한다.

🌗 문제 자세히보기

해당 문제는 단순하게 가장큰 수 와 가장 작은 수에서 시작하여 한칸 씩 이동하여 합을 구하는 방식이다. 

  • 두 수의 합이 0보다 크면 다음으로 큰수로 포인터 이동(right 왼쪽으로 이동)
  • 두 수의 합이 0보다 작으면 다음으로 작은수로 포인터 이동(left 오른쪽으로 이동)
//두 용액의 합이 0보다  크면 right 왼쪽으로 이동
if(0 < sum)
{
    right--;
}
else //두 용액의 합이 0보다 작으면 left 오른쪽으로 이동
{
    left++;
}

 

여기서 중요한 포인트는 

🚩 N개의 용액들의 특성값은 모두 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.

 

즉 모두 양수가 될수도 , 모두 음수가 될수도 있다. 

이때 간편하게 처리하기 위해서 용액을 담은 배열을 오름차순으로 정렬하고 아래 조건에 맞춰 확인한다.

  • 첫번째(가장 작은)수가 양수이면 모든 수는 양수

> 용액 배열에 첫번째와 두번째 수를 더하면 가장 0 에 가까운 수가 된다. 

  • 마지막번째(가장큰) 수가 음수라면 모든 수각 음수

> 용액 배열에 마지막번째 와 마지막에서 두번째 수를 더하면 가장 0 에 가까운 수가 된다.

 //1. 용액 오름차순
Arrays.sort(arr);
        
if(arr[0]> 0)
{
    //모든 수는 양수
    answer[0] = arr[0];
    answer[1] = arr[1];
}
else if(arr[n-1]<0)
{
    //모든 수는 음수
    answer[0] = arr[n-2];
    answer[1] = arr[n-1];
}

 

또 다른 포인트 

🚩특성값이 0에 가장 가까운 용액을 만들어내는 경우가 두 개 이상일 경우에는 그 중 아무것이나 하나를 출력한다.

 

아.무.것.이.나 출력 한다라는것은 어떠한 조건 없이 0이 되는 수만 찾으면 바로 모든 조회를 종료하고 출력하면 된다는 것이다. 

왜냐하면 0 은 0 이기에 그 어떠한 두 수의 합보다 더 가까울 수 없다. 

 

if(sum == 0)
{
    Arrays.sort(answer); //정답은 오름차순

    System.out.println(answer[0] + " " + answer[1]);    
    return;
}

 


🌕 최종코드

import java.io.*;
import java.util.*;
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[] arr= new int[n];
        int[] answer = new int[2];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0;i<n;i++)
        {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        //1. 용액 오름차순
        Arrays.sort(arr);

        if(arr[0]> 0)
        {
            //모든 수는 양수
            answer[0] = arr[0];
            answer[1] = arr[1];
        }
        else if(arr[n-1]<0)
        {
            //모든 수는 음수
            answer[0] = arr[n-2];
            answer[1] = arr[n-1];
        }
        else 
        {
            long result = Integer.MAX_VALUE;

            int left = 0;
            int right = n-1;      

            while(left<right)
            { 
                long sum = arr[left] + arr[right];

                //합 비교
                if(Math.abs(sum) <= Math.abs(result))
                {
                    answer[0] = arr[left];
                    answer[1] = arr[right];
                    result = sum;
                }
                             
                //두 용액의 합이 0보다  크면 right 왼쪽으로 이동
                if(0 < sum)
                {
                    right--;
                }
                else if(sum == 0)
                {
                    Arrays.sort(answer); //정답은 오름차순

                    System.out.println(answer[0] + " " + answer[1]);    
                    return;
                }
                else 
                {
                    left++;
                }               
                
            }
        }        

        Arrays.sort(answer); //정답은 오름차순

        System.out.println(answer[0] + " " + answer[1]);              
     }
}