백준 2295번: 세 수의 합 [이분 탐색][자료구조] - Java :: 매운코딩
728x90
300x250

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

 

2295번: 세 수의 합

우리가 x번째 수, y번째 수, z번째 수를 더해서 k번째 수를 만들었다라고 하자. 위의 예제에서 2+3+5=10의 경우는 x, y, z, k가 차례로 1, 2, 3, 4가 되며, 최적해의 경우는 2, 3, 4, 5가 된다. k번째 수가 최

www.acmicpc.net

A+B+C=D 에서 A+B=D-C로 바꾸어서 풀어야 하는 문제. 골드는 골드다.

 

백준 3273번 두 수의 합 문제에서 응용해서 푸는 문제인데 어렵네요.....

 

 

728x90

 

<Java 성공 코드>

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		//System.setIn(new FileInputStream("Test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int[] arr = new int[N];
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i] = Integer.parseInt(st.nextToken());
		}
		Arrays.sort(arr);
		// A+B+C=D .. A+B=D-C로 계산하여 A+B한 값이 D-C 범위에 있는지를 본다.
		
		// A+B하기 O(N^2)
		HashSet<Integer> sum = new HashSet<Integer>();
		for (int i = 0; i < arr.length; i++) {
			for (int j = i; j < arr.length; j++) {
				sum.add(arr[i]+arr[j]); //더한값은 동일
			}
		}
		
//		Iterator it = sum.iterator();
//		while(it.hasNext()) {
//			System.out.print(it.next()+" ");
//		}
//		System.out.println();
		
		//D-C에 있는지 확인하기.
		int res = -1;
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length; j++) {
				int k = arr[i]-arr[j];
//				System.out.print(k+" ");
				if(sum.contains(k)) {
					res = Math.max(arr[i], res);
				}
			}
		}
//		System.out.println();
		System.out.println(res);
	}

}
728x90

+ Recent posts