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]);
}
}
'항해' 카테고리의 다른 글
[DAY43] 99클럽 코딩테스트 JAVA 백준 숨바꼭질 1697번 (1) | 2025.01.21 |
---|---|
[DAY42] 99클럽 코딩테스트 JAVA 백준 DFS와 BFS 1260번 (1) | 2025.01.20 |
[DAY40] 99클럽 코딩테스트 JAVA 백준 기타 레슨 2343번 (0) | 2025.01.16 |
[DAY39] 99클럽 코딩테스트 JAVA 백준 선분 위의 점 11663번 (1) | 2025.01.15 |
[DAY38] 99클럽 코딩테스트 JAVA 백준 랜선자르기 1654번 (0) | 2025.01.14 |