코테/백준

[백준/JAVA] 1920번: 수 찾기

imname1am 2023. 4. 18. 12:19
반응형

🔺 문제

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

🔺 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

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

        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());
        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < M ; i++) {
            boolean find = false;
            int target = Integer.parseInt(st.nextToken());

            int start = 0;
            int end = A.length - 1;

            while(start <= end) {
                int mid = (start + end) / 2; // 중앙값

                if(A[mid] > target) {
                    end = mid - 1;
                }
                else if(A[mid] < target) {
                    start = mid + 1;
                }
                else {
                    find = true;
                    break;
                }

            }

            if(find) sb.append(1).append("\n");
            else     sb.append(0).append("\n");
        }
        System.out.println(sb);
    }
}
✅ 해결 아이디어
- 이진 탐색 사용 (시간 복잡도 : O (nlogn))

 

💥 유의사항

⇨ 이진 탐색, 반드시 데이터가 정렬되어 있어야 함!

 


🔺 다른 풀이들

- 풀이1)

 

[백준] 1920번 : 수 찾기 - JAVA [자바]

https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음

st-lab.tistory.com

Arrays.binarySearch() 메소드를 사용한 풀이도 넣어주셨다.

 

 

- 풀이2)

 

[JAVA 자바] 백준 1920번 : 수 찾기

▶ 문제 https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진

jumping-to-the-water.tistory.com

재귀를 이용한 풀이도 볼 수 있당

 


💬 느낀 점

이분 탐색은 탐색 전 무조건 데이터 정렬이 필요하다!!

되게 일타 강사쌤 같은 헤메코 앤나 포즈,,

 

1회독 2회독 3회독 4회독 5회독
V 6/12      

 

 

(+6/12 2회독)

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
47
48
49
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        int n = Integer.parseInt(br.readLine());
        int[] A = new int[n];
        
        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());
        
        st = new StringTokenizer(br.readLine()," ");
        while(m --> 0) {
            boolean find = false;
            int target = Integer.parseInt(st.nextToken());
            
            int s = 0;
            int e = A.length - 1;
            
            while(s <= e) {
                int mid = (s + e) / 2;        // 중앙값
                
                if(A[mid] == target) {
                    find = true;
                    break;
                }
                else if(A[mid] < target) {
                    s = mid + 1;
                }
                else if(A[mid] > target) {
                    e = mid - 1;
                }
            }
            
            sb.append(find ? 1 : 0).append("\n");
        }
        System.out.println(sb);
    }
}
cs

반응형