끄적끄적 코딩
article thumbnail

이분탐색 문제입니다.

두개의 값의 합이 x가 되는 값을 찾아야합니다.
만약 값이 여러개라면 더 두개의 차의 절댓값이 더 큰 값들을 출력합니다.

이분탐색은 한개의 값을 고정으로 두고
(고정 값) + (이분탐색을 통해 찾는 값) 이  x가 될 수 있는지 찾습니다.
두 값의 합이 x보다 작으면 left = mid + 1
두 값의 합이 x보다 크면 right = mid - 1
두 값의 합이 x와 같다면 절댓값을 비교해서 더 클 경우 결과값에 저장합니다.

이분탐색 자체는 어렵지 않은 문제이지만
테스트 케이스가 여러개로 이루어져있다는 점을 제대로 확인하지 못하여 시간이 많이 걸렸습니다.

while ((s = br.readLine()) != null) {
}

입력의 시작 부분에 입력이 null이면 종료하도록 해주었습니다.
그리고 출력하는 값에 "\n"를 넣지 않은 문제도 있었습니다.

import java.util.*;
import java.io.*;

public class Main {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    String s;
    int x;
    int n;
    int[] arr;
    boolean possible;
    int lego1;
    int lego2;

    while ((s = br.readLine()) != null) {
      x = Integer.parseInt(s) * 10000000;
      n = Integer.parseInt(br.readLine());
      arr = new int[n];
      possible = false;
      lego1 = 0;
      lego2 = 0;

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

      Arrays.sort(arr);

      for (int i = 0; i < n; ++i) {
        int piece1 = i;
        int left = i + 1;
        int right = n - 1;

        while (left <= right) {
          int piece2 = (left + right) / 2;
          if (arr[piece1] + arr[piece2] == x) {
            if (Math.abs(arr[piece1] - arr[piece2]) >= Math.abs(arr[lego1] - arr[lego2])) {
              possible = true;
              lego1 = piece1;
              lego2 = piece2;
            }
            break;
          } else if (arr[piece1] + arr[piece2] < x) {
            left = piece2 + 1;
          } else if (arr[piece1] + arr[piece2] > x) {
            right = piece2 - 1;
          }
        }
      }

      if (possible) {
        bw.write("yes " + arr[lego1] + " " + arr[lego2] + "\n");
      } else {
        bw.write("danger \n");
      }
    }
    bw.close();

  }
}

'알고리즘' 카테고리의 다른 글

[Java] 백준 2343번 기타 레슨  (0) 2023.08.08
[Java] 백준 1034번 램프  (0) 2023.08.06
[Java] 백준 19539번 사과나무  (0) 2023.08.04
[Java] 백준 5557번 1학년  (0) 2023.08.03
[Java] 백준 3079번 입국심사  (0) 2023.08.02

검색 태그