Algorithm/이코테

부품 찾기

마닐라 2021. 11. 23. 14:04

📍 문제 설명

동빈이네 전자 매장에는 부품이 N개 있다. 각 부품은 정수 형태의 고유한 번호가 있다. 어느 날 손님이 M개의 종류의 부품을 대량으로 구매하겠다며 당일 날 견적서를 요청했다. 동빈이는 때를 놓치지 않고 손님이 문의한 부품 M개 종류를 모두 확인해서 견적서를 작성해야 한다. 이때 가게 안에 부품이 모두 있는지 확인하는 프로그램을 작성해보자.
예를 들어 가게의 부품이 총 5개일 때 부품 번호가 다음과 같다고 하자.

N=5
[8, 3, 7, 9, 2]

손님은 총 3개의 부품이 있는지 확인 요청했는데 부품 번호는 다음과 같다.

M=3
[5, 7, 9]

이때 손님이 요청한 부품 번호의 순서대로 부품을 확인해 부품이 있으면 yes를, 없으면 no를 출력한다. 구분은 공백으로 한다.

입력

  • 첫째 줄에 정수 N이 주어진다. (1<=N<=1,000,000)
  • 둘째 줄에는 공백으로 구분하여 N개의 정수가 주어진다. 이때 정수는 1보다 크고 1,000,000 이하이다.
  • 셋째 줄에는 정수 M이 주어진다. (1<=M<=100,000)
  • 넷째 줄에는 공백으로 구분하여 M개의 정수가 주어진다. 이때 정수는 1보다 크고 10억 이하이다.

출력

  • 첫째 줄에 공백으로 구분하여 각 부품이 존재하면 yes를, 없으면 no를 출력한다.

입력 예시

5
8 3 7 9 2
3
5 7 9

출력 예시

no yes yes

💡 접근

요청한 부품 번호에 대해서 가게의 부품 번호들을 모두 탐색해서 찾아봐야하므로 이진 탐색 풀이가 가능하다.

요청한 부품 번호 하나당 가게의 부품 번호들에 대해 있는 번호인지 탐색해본다.

 

👩‍💻 코드

1.이진 탐색

import java.util.*;

public class Main {
    public static int n;
    public static int m;
    public static int[][] arr;

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);

        int n = kb.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        Arrays.sort(arr);

        int m = kb.nextInt();
        int[] targets = new int[m];
        for(int i = 0; i < m; i++) {
            targets[i] = kb.nextInt();
        }

        //요청한 부품들을 확인
        for(int i = 0; i < m; i++) {
            System.out.print(binarySearch(0, n-1, targets[i], arr) + " ");
        }


    }

    private static String binarySearch(int start, int end, int target, int[] arr) {
        while(start <= end) {
            int mid = (start + end) / 2;
            //찾고자하는 부품 번호가 중간 번호보다 크면 오른쪽 탐색
            if(target > arr[mid]) start = mid + 1;
            //찾고자하는 부품 번호가 중간 번호보다 작으면 왼쪽 탐색
            else if (target < arr[mid]) end = mid - 1;
            //찾으면 YES!
            else return "yes";

        }
        return "no";
    }
}

 

2.계수 정렬

import java.util.*;

public class Main {
    public static int n;
    public static int m;
    public static int[][] arr;

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);

        int n = kb.nextInt();
        int[] arr = new int[n];
        //계수 정렬
        int[] count = new int[1000001];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
            count[arr[i]] = 1;
            //부품 번호는 중복되지 않을테니 ++ 말고 그냥 1 넣어줘도됨
        }

        int m = kb.nextInt();
        int[] targets = new int[m];
        for (int i = 0; i < m; i++) {
            targets[i] = kb.nextInt();
        }

        //각 부품번호에 대해 확인
        for(int i = 0; i < m; i++) {
            if(count[targets[i]] == 0) System.out.print("no ");
            else System.out.print("yes ");
        }
    }
}

'Algorithm > 이코테' 카테고리의 다른 글

개미 전사  (0) 2021.11.25
떡볶이 떡 만들기  (0) 2021.11.24
두 배열의 원소 교체  (0) 2021.11.23
미로 탈출  (0) 2021.11.22
★음료수 얼려 먹기  (0) 2021.11.22