[백준 자바] 1920번(수 찾기) - Set, 이진 탐색, Arrays.binarySearch()

2024. 6. 27. 14:55·코딩테스트/백준-Java
728x90

실버 4

문제

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

 


 

728x90

1. Set 집합

N개의 정수 A[1], A[2], …, A[N]을 Set에 저장하여 Set.contains를 이용해 X가 Set에 있는지 확인한다.

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

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));

    int N = Integer.parseInt(br.readLine());
    Set<Integer> A = new HashSet<>();

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < N; i++) {
      A.add(Integer.parseInt(st.nextToken()));
    }

    int M = Integer.parseInt(br.readLine());

    StringBuilder sb = new StringBuilder();

    st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < M; i++) {
      sb.append(A.contains(Integer.parseInt(st.nextToken())) ? '1' : '0').append('\n');
    }

    bw.write(sb.toString());

    bw.flush();
    br.close();
    bw.close();
  }
}

 

2. 이진 탐색

이진 탐색을 하기 위해 배열 A를 오름차순으로 정렬한다.

검색값이 배열A의 중앙값보다 크면 검색 범위를 중앙값의 뒤쪽으로 좁히고, 중앙값보다 작으면 검색 범위를 중앙값의 앞쪽으로 좁힌다. 중앙값이 검색값과 일치할 때까지 반복한다.

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

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

    int N = Integer.parseInt(br.readLine());
    int[] A = new int[N];

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < N; i++) {
      A[i] = Integer.parseInt(st.nextToken());
    }
    Arrays.sort(A);

    int M = Integer.parseInt(br.readLine());

    StringBuilder sb = new StringBuilder();

    st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < M; i++) {
      int key = Integer.parseInt(st.nextToken());
      int pl = 0;
      int pr = N - 1;
      boolean found = false;

      do {
        int pc = (pl + pr) / 2;
        if (A[pc] == key) {
          sb.append('1').append('\n');
          found = true;
          break;
        } else if (A[pc] < key)
          pl = pc + 1;
        else
          pr = pc - 1;
      } while (pl <= pr);

      if (!found)
        sb.append('0').append('\n');
    }

    bw.write(sb.toString());

    bw.flush();
    br.close();
    bw.close();
  }
}
  • pl: 검색 범위의 첫 인덱스
  • pr: 검색 범위의 마지막 인덱스
  • pc: 중앙 요소의 인덱스
  • 검색값 key가 중앙값보다 큰 경우 pl을 pc + 1로 하여 검색 범위를 뒤 절반으로 좁힘
  • 검색값 key가 중앙값보다 작은 경우 pr을 pc - 1로 하여 검색 범위를 앞 절반으로 좁힘
  • key값을 찾으면 1 리턴
  • pl = pr이 될 때까지 key를 찾지 못한 경우(found = false) 0 리턴

3. Arrays.binarySearch

배열에서 이진 탐색을 하는 메서드(java.util.Arrays)

검색에 성공한 경우 key와 일치하는 요소의 인덱스를, 검색에 실패한 경우 배열에 key가 있어야 할 위치(삽입 포인트)를 반환한다. 삽입 포인트를 x라 할 때 반환값은 -x-1이다.

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

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

    int N = Integer.parseInt(br.readLine());
    int[] A = new int[N];

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < N; i++) {
      A[i] = Integer.parseInt(st.nextToken());
    }
    Arrays.sort(A);

    int M = Integer.parseInt(br.readLine());

    StringBuilder sb = new StringBuilder();

    st = new StringTokenizer(br.readLine(), " ");
    for (int i = 0; i < M; i++) {
      int key = Integer.parseInt(st.nextToken());

      sb.append(Arrays.binarySearch(A, key) >= 0 ? '1' : '0').append('\n');
    }

    bw.write(sb.toString());

    bw.flush();
    br.close();
    bw.close();
  }
}

728x90

'코딩테스트 > 백준-Java' 카테고리의 다른 글

[백준 자바] 10799번(쇠막대기)  (0) 2024.06.28
[백준 자바] 2417번(정수 제곱근) - 큰 수 제곱근  (0) 2024.06.27
[백준 자바] 11660번(구간 합 구하기 5) - 2차원 배열 누적 합  (0) 2024.06.26
[백준 자바] 1124번(언더프라임) - 소인수 개수가 소수인 수  (0) 2024.06.25
[백준 자바] 1644번(소수의 연속합)  (0) 2024.06.24
'코딩테스트/백준-Java' 카테고리의 다른 글
  • [백준 자바] 10799번(쇠막대기)
  • [백준 자바] 2417번(정수 제곱근) - 큰 수 제곱근
  • [백준 자바] 11660번(구간 합 구하기 5) - 2차원 배열 누적 합
  • [백준 자바] 1124번(언더프라임) - 소인수 개수가 소수인 수
gamzaggang7
gamzaggang7
    250x250
  • gamzaggang7
    abcdefghklpqrstuvwxyz
    gamzaggang7
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS
        • OS
        • 자료구조_알고리즘
      • Java
      • Javascript
      • Node.js
      • React
      • Vue.js
      • 코딩테스트
        • 백준-Java
        • 프로그래머스-JS
      • Canvas
      • HTML, CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바스크립트
    프로그래머스
    props
    React
    canvas
    정렬
    해시
    Node.js
    fegaussianblur
    vue.js
    스택
    dat.gui
    vue modal
    vue animation
    자바공부
    fecolormatrix
    til
    css
    서버구축
    큐
    백준풀이
    Next.js
    오즈코딩스쿨
    자바백준풀이
    BFS
    hashchange
    라우팅
    2차원배열
    npm
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gamzaggang7
[백준 자바] 1920번(수 찾기) - Set, 이진 탐색, Arrays.binarySearch()
상단으로

티스토리툴바