[백준:10815] 숫자 카드 (JAVA)

dev_kiiim·2022년 12월 21일
0

CODING TEST

목록 보기
20/23
post-thumbnail

오늘도 어김없이 이분 탐색에 대한 문제를 풀어봤다.
어제 풀었던 숫자카드2와 비슷한 문제인데, 동일한 숫자가 있을때는 1을 없을때는 0을 출력하도록 하는 문제였다.


public static void main(String[] args) {
    int N;
    int M;
    StringBuilder sb = new StringBuilder();
    Scanner sc = new Scanner(System.in);
    N = sc.nextInt();
    int[] nArr = new int[N];
    for (int i = 0; i < N; i++) {
        nArr[i] = sc.nextInt();
    }
    Arrays.sort(nArr);
    M = sc.nextInt();

    for (int i = 0; i < M; i++) {
        int m = sc.nextInt();
        int left = 0;
        int right = N - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nArr[mid] == m) {
                sb.append(1 + " ");
                break;
            }
            if (nArr[mid] > m) { 
                right = mid - 1;
            } else {
                left = mid + 1;
            }
            if (left > right) {
                sb.append(0 + " ");
                break;
            }
        }
    }
    System.out.println(sb.toString());
}

어제 풀어 본 문제를 해결하지는 못했지만 같은 유형의 문제이기도 하고
이분탐색으로 풀 수 있을 것 같은 마음에 금방 풀겠지,, 했지만,,,
생각보다 너무 오랫동안 풀게 되었다.

일단 위의 코드는 다른 분이 올려두신 코드를 참고하여 제출한 코드이다.
내가 푼 코드는 왜인지 모르겠는데 1을 체크하지 않고 다 0으로만 출력이 되어서 다른 분들 코드를 검색하다가 내 코드와 제일 비슷한 코드를 참고하였다.

미해결 코드

public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    int N = Integer.parseInt(bf.readLine());
    int[] n = new int[N];
    StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
    for (int i = 0; i < N; i++) {
        n[i] = Integer.parseInt(st.nextToken());
    }
    Arrays.sort(n);
    int M = Integer.parseInt(bf.readLine());
    int[] m = new int[M];
    st = new StringTokenizer(bf.readLine(), " ");
    for (int i = 0; i < M; i++) {
        m[i] = Integer.parseInt(st.nextToken());
    }

    StringBuilder sb = new StringBuilder();

    for(int i=0; i<M; i++){
        int start = 0;
        int end = N-1;
        while(start <= end){
            int mid = (start+end)/2;
            if(m[i] == n[mid]){
                sb.append(1 + " ");
                break;
            }
            if(m[i] >= n[mid]){
                end = mid-1;
            }else{
                start = mid+1;
            }
            if (start > end) {
                sb.append(0 + " ");
                break;
            }
        }
    }
    System.out.println(sb);
}

이 코드가 미해결 코드이다.
어제 풀지못한 문제와 함께 이 문제도 다시 봐야할 것 같다,,😞

0개의 댓글