코딩테스트/백준
[백준 - 2295] 세 수의 합 .java
머밍
2025. 5. 18. 12:50
https://www.acmicpc.net/problem/2295
- 입력받은 숫자들 중에 중복을 허용하여 3개를 택하고 그 3개의 합이 입력받은 수들중에 있으면 된다
3개의 합을 계산하기 위해 3개의 for 문을 중첩해서 사용하면 시간 초과이다
이를 방지하기 위해,
- A+B: 숫자 2개의 합을 중복없이 저장해야함
- T-C: 연산의 결과를 가진 값이 위에서 구한 A+B의 값들중 하나라면 정답 증가
- 두 경우 모두 같은 값이 연달아 올 수 있음을 유의
- 최댓값만 갱신
Set 풀이
A+B한 결과가 중복이 없어야함 -> HashSet 사용
또한 T-C의 결과가 contains()메서드를 활용해서 바로 구할 수 있음
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Solution {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i =0;i <n;i++) {
nums[i] = sc.nextInt();
}
Arrays.sort(nums);
//숫자 두개의 합 조합, 중복 없어야 -> set
Set<Integer> sum2 = new HashSet<>();
for(int i =0;i<n;i++) {
for(int j =0 ;j <n ;j++) {
sum2.add(nums[i]+nums[j]);
}
}
int answer = 0;
for(int i =0;i<n;i++) {
for(int j = 0; j <n;j++) {
int t = nums[i] - nums[j];
if(sum2.contains(t)) {
answer = Math.max(answer, nums[i]);
}
}
}
System.out.println(answer);
}
}
이분탐색 - 배열 풀이
- A+B
- 배열의 크기 : i가 0이면 j는 n번, i가 1이면 j는 n-1번 -> 1부터 n까지의 합 => n(n+1) /2
- 중복 가능 : j의 시작은 i번째부터
- 이분탐색을 위해 오름차순으로 정렬
- 이분 탐색 , T-C
- 함수로 구현 : T-C한 값이 sum2 배열에 존재하는지 탐색
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static boolean isExist(int[] s, int t) {
int l = 0;
int r = s.length;
while(l<=r) {
int mid = (l+r)/2;
int result = s[mid] - t;
if(result ==0) return true;
else if(result>0) r = mid-1;
else l = mid+1;
}
return false;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i =0;i <n;i++) {
nums[i] = sc.nextInt();
}
Arrays.sort(nums);
//두 수의 합, 중복 없어야함
int[] sum2= new int[n*(n+1) /2];
int index = 0;
for(int i = 0; i<n;i++) {
for(int j = i; j<n;j++) {
sum2[index++] = nums[i] + nums[j];
}
}
Arrays.sort(sum2);
int answer = 0;
for(int i =0;i<n;i++) {
for(int j =0; j<n;j++) {
int t = nums[i] - nums[j];
if(isExist(sum2,t)) {
answer = Math.max(nums[i], answer);
}
}
}
System.out.println(answer);
}
}