백준 1920 수 찾기 - JAVA

2025. 2. 4. 17:25·알고리즘/백준

1920 문제 링크


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

 

문제 설명


 

입출력


 

코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.io.*;
import java.util.*;
 
public class Main {
    static int[] arr;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int N = Integer.parseInt(br.readLine());
        arr = new int[N];
        StringBuilder sb = new StringBuilder();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        } 
        Arrays.sort(arr);
        
        int M = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < M; i++) {
            int num = Integer.parseInt(st.nextToken());
            sb.append(isIn(num) + "\n");
        }
        
        bw.write(sb.toString());
        bw.flush();
    }
    private static int isIn(int num) {
        int left = 0;
        int right = arr.length - 1;
        while(left <= right) {
            int mid = (left + right) / 2;
            if (num == arr[mid]) {
                return 1;
            } else if (num < arr[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return 0;
    }
}
Colored by Color Scripter
cs

 

알고리즘 설명


해당 문제는 이분탐색과 HashSet 두 가지로 문제 해결이 가능합니다. 하지만 문제의 단계가 이분 탐색인만큼 이분 탐색을 활용하여 문제를 풀어보았습니다.
이분 탐색(Binary Search)은 정렬된 배열에서 특정 값을 찾는 알고리즘입니다. 선형탐색의 시간복잡도는 O(n)이고, 이분탐색의 시간복잡도는 O(logn)으로 선형 탐색과 달리 배열 크기를 반씩 나누면서 찾기 때문에, 탐색 횟수는 “배열 크기의 로그”에 비례합니다.
 
해당 문제에서 사용한 이분탐색의 방법입니다.

  1. 배열의 중간값을 찾는다.
  2. 중간값이 찾고자 하는 값과 같으면 1을 반환한다.
  3. 중간값이 찾고자 하는 값보다 크면 right의 값을 중간값에서 1을 뺀 수로 설정한다.
  4. 중간값이 찾고자 하는 값보다 작으면 left의 값을 중간값에서 1을 더한 수로 설정한다.
  5. 배열에서 값을 찾지 못하면 0을 반환한다.

 

코드 해석


N과 입력값들을 arr 배열에 입력하고 해당 배열을 오름차순으로 정렬합니다. M만큼 입력 받은 수들을 차례로 이분탐색 함수( isIn함수 )에 집어넣어 1 또는 0을 반환합니다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 1697 숨바꼭질 - JAVA  (1) 2025.02.06
백준 1012 유기농 배추 - JAVA  (1) 2025.02.05
백준 2667 단지번호붙이기 - JAVA  (1) 2025.02.03
백준 10844 쉬운 계단 수 - JAVA  (0) 2025.02.02
백준 2579 계단 오르기 - JAVA  (0) 2025.02.01
'알고리즘/백준' 카테고리의 다른 글
  • 백준 1697 숨바꼭질 - JAVA
  • 백준 1012 유기농 배추 - JAVA
  • 백준 2667 단지번호붙이기 - JAVA
  • 백준 10844 쉬운 계단 수 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 알고리즘 (54)
        • 백준 (45)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

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

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    CS
    브루트포스
    Top-Down
    완전탐색
    Baekjoon
    재귀
    깊이 우선 탐색
    백트래킹
    너비 우선 탐색
    Lv2
    java
    BFS
    백준
    프로그래머스
    동적 계획
    DFS
    자료구조
    알고리즘 고득점 kit
    기술질문
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 1920 수 찾기 - JAVA
상단으로

티스토리툴바