BackJoon Algorithm 세수의 합 2295 (Java)

업데이트:
1 분 소요

BackJoon Algorithm - Java

alt

문제

alt

풀이

1. Collections.binarySearch 를 이용한 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


/**
 * 이분탐색 ( 주의 이분탐색은 항상 정렬을 해야함 )
 * A + B 를 먼저 더해 집합 list를 만든뒤 (list)
 * C를 대입하여 이전 arr에 가장 큰수를 구한다.
 */
public class Back_2295_2 {
    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];
        List<Integer> list = new ArrayList<>();
        int sum = 0;
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                list.add(arr[i] + arr[j]);
            }
        }
        Arrays.sort(arr);
        Collections.sort(list);
        for (int i = N - 1; i >= 0; i--) {
            for (int j = 0; j < N; j++) {
                int gap = arr[i] - arr[j];
                if(Collections.binarySearch(list,gap) >= 0){
                    System.out.println(arr[i]);
                    return;
                }
            }
        }
        br.close();
    }

}


2. 직접 BinarySearch를 구현하여 만든 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


/**
 * 이분탐색 ( 주의 이분탐색은 항상 정렬을 해야함 )
 * A + B 를 먼저 더해 집합 list를 만든뒤 (list)
 * C를 대입하여 이전 arr에 가장 큰수를 구한다.
 */
public class Back_2295 {
    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];
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                list.add(arr[i] + arr[j]);
            }
        }
        Arrays.sort(arr);
        Collections.sort(list);
        for (int i = N - 1; i >= 0; i--) {
            for (int j = 0; j < N; j++) {
                int gap = arr[i] - arr[j];
                if (binarySearch(list, gap)) {
                    System.out.println(arr[i]);
                    return;
                }
            }
        }
        br.close();
    }

    private static boolean binarySearch(List<Integer> list, int gap) {
        int min = 0;
        int max = list.size() - 1;

        while (min < max) {
            int mid = (max + min) / 2;
            if(list.get(mid) == gap) return true;
            else if(list.get(mid) > gap) max = mid -1;
            else min = mid + 1;
        }
        return false;
    }

}

댓글남기기