프로그래머스 백준 문제

백준 1920

전한준 2025. 6. 16. 15:04

1920번: 수 찾기

 

 

 

 

이 문제 같은 경우 Set으로 풀면 단순 포함여부로 1로 표시 하면 되고 없으면 0으로 표시하면 간단히 해결된다. 

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

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws IOException {
     BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    int n=Integer.parseInt(br.readLine());
        HashSet<Integer>set=new HashSet<>();
        StringTokenizer st=new StringTokenizer(br.readLine()," ");
        for(int i=0;i<n;i++){
               set.add(Integer.parseInt(st.nextToken()));
        }
        int m=Integer.parseInt(br.readLine());
        st=new StringTokenizer(br.readLine()," ");
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<m;i++){
            int target=Integer.parseInt(st.nextToken());
            if(set.contains(target)){
                sb.append(1).append('\n');
            }
            else{
                sb.append(0).append('\n');
            }
            
        }
        System.out.println(sb);
        
    }
}

 

 

이분 탐색으로 풀면 이렇게 풀면 된다. 

import java.util.Scanner;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
 
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		int[] arr = new int[N];
		
 
		for(int i = 0; i < N; i++) {
			arr[i] = in.nextInt();
		}
		
		
		// 배열은 반드시 정렬되어있어야한다.
		Arrays.sort(arr);
		
		int M = in.nextInt();
		
		
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < M; i++) {
			
			// 찾고자 하는 값이 있을 경우 1, 없을 경우 0을 출력해야한다.
			if(binarySearch(arr, in.nextInt()) >= 0) {
				sb.append(1).append('\n');
			}
			else {
				sb.append(0).append('\n');
			}
		}
		System.out.println(sb);
	}
	
	
	/**
	 * @param arr 정렬 된 배열
	 * @param key 찾으려는 값
	 * @return key와 일치하는 배열의 인덱스
	 */
	public static int binarySearch(int[] arr, int key) {
 
		int lo = 0;					// 탐색 범위의 왼쪽 끝 인덱스
		int hi = arr.length - 1;	// 탐색 범위의 오른쪽 끝 인덱스
 
		// lo가 hi보다 커지기 전까지 반복한다.
		while(lo <= hi) {
 
			int mid = (lo + hi) / 2;	// 중간위치를 구한다.
 
			// key값이 중간 위치의 값보다 작을 경우
			if(key < arr[mid]) {
				hi = mid - 1;
			}
			// key값이 중간 위치의 값보다 클 경우
			else if(key > arr[mid]) {
				lo = mid + 1;
			}
			// key값과 중간 위치의 값이 같을 경우
			else {
				return mid;
			}
		}
 
		// 찾고자 하는 값이 존재하지 않을 경우
		return -1;
 
	}
}

 

 

'프로그래머스 백준 문제' 카테고리의 다른 글

자바 CompareTo 와 Compare 비교 및 차이(1181번,11650번)  (0) 2025.06.21
9935번 문자열 폭발  (2) 2025.06.19
백준 10816 숫자카드2  (0) 2025.06.16
백준 이분탐색 2512  (0) 2025.06.16
2920  (0) 2024.09.19