문제 풀이 - 수 찾기(JAVA)

지식 저장소·2021년 12월 11일
0

코딩테스트

목록 보기
25/29

수 찾기

풀이

처음에 배열에서 수를 찾는 문제이므로 이분 탐색으로 해야 겠다 싶어서 N의 최댓값을 봤더니 100,000이었습니다. 원래 이분 탐색의 시간 복잡도는 O(logN)O(\log N)이지만 잠깐 착각해서 O(NlogN)O(N\log N)으로 생각하고 문제를 풀었습니다. 그래서 이분 탐색이 아닌 두 배열을 정렬해서 비교하는 식으로 풀었습니다.

구현

import java.util.*;

public class Main {

    public static int N, M;
    public static int[] A, B, C;
    public static HashMap<Integer, Integer> map = new HashMap<>();

    public static void input(Scanner scanner) {
        N = scanner.nextInt();
        A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = scanner.nextInt();
        }
        Arrays.sort(A);
        M = scanner.nextInt();
        B = new int[M];
        for (int i = 0; i < M; i++) {
            B[i] = scanner.nextInt();
        }
        C = Arrays.copyOf(B, B.length);
        Arrays.sort(C);
    }

    public static void solve() {
        int indexA = 0;
        for (int i = 0; i < M; i++) {
            boolean finish = false;
            while (indexA < A.length && A[indexA] < C[i]) indexA++;
            if (indexA >= A.length) finish = true;
            if (finish == true || A[indexA] != C[i]) {
                map.put(C[i], 0);
            } else {
                map.put(C[i], 1);
            }
        }
    }

    public static void output() {
        for (int i : B) {
            System.out.println(map.get(i));
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int tc = 1;
        for (int i = 1; i <= tc; i++) {
            input(scanner);
            solve();
            output();
        }
    }
}

이렇게 풀고 보니 조금 깨끗하게 푼 것 같지 않아서 다른 사람들이 푼 것을 확인해보니 이분 탐색으로 풀었다는 것을 보고 시간 복잡도를 착각했다는 것을 알았습니다.

import java.util.*;

public class Main {

    public static int N, M;
    public static int[] A;
    public static int[] result;

    public static void input(Scanner scanner) {
        N = scanner.nextInt();
        A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = scanner.nextInt();
        }
        Arrays.sort(A);
        M = scanner.nextInt();
        result = new int[M];
        for (int i = 0; i < M; i++) {
            int num = scanner.nextInt();
            if (Arrays.binarySearch(A, num) >= 0) result[i] = 1;
            else result[i] = 0;
        }
    }

    public static void solve() {

    }

    public static void output() {
        for (int i : result) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int tc = 1;
        for (int i = 1; i <= tc; i++) {
            input(scanner);
            solve();
            output();
        }
    }
}

회고

이분 탐색으로 풀면 매우 깔끔하다.

profile
그리디하게 살자.

0개의 댓글