Algorithm

[Algorithm] 부품 찾기

씬프 2021. 5. 16. 09:00
반응형

문제

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

 

예를 들어, 가게의 부품이 총 5개일 때 부품 번호가 다음과 같다고 하자.

N = 5

[8, 3, 7, 9, 2]

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

M = 3

[5, 7, 9]

이 때, 부품이 있으면 yes, 없으면 no를 출력한다.

 

입력 조건

첫번째 줄에 가게의 부품 총 개수 N이 입력된다.

두번째 줄에 가게에 있는 부품의 부품번호가 입력된다.

세번째 줄에 손님이 원하는 부품의 총 개수 M이 입력된다.

네번째 줄에 손님이 원하는 부품의 부품번호가 입력된다.

 

출력 조건

부품이 있다면 yes, 없다면 no를 출력하시오.

 

풀이

가게에 있는 부품의 부품번호를 배열로 받고, 배열에 손님이 원하는 부품번호가 있는지 확인한다.

 

import java.util.*;

class Main {

  public static void main(String[] args) {
    int n, m;

    Scanner sc = new Scanner(System.in);
    
    n = sc.nextInt();
    int[] inStore = new int[n];

    for (int i = 0; i < n; i++) {
      inStore[i] = sc.nextInt();
    }
    
    m = sc.nextInt();
    int[] wanna = new int[m];
    
    for (int i = 0; i < m; i++) {
      wanna[i] = sc.nextInt();
    }
    sc.close();

    for (int w : wanna) {
      if (Arrays.stream(inStore).anyMatch(i -> i == w))
        System.out.print("yes ");
      else
        System.out.print("no ");
    }
  } // end main
}

 

배열에 포함되어있는지 확인할 때

보통 문자열 내에 특정 문자, 문자열이 포함되어있는지 확인하는 경우 .contains()를 통해 확인할 수 있다.

정수형 배열과 같이 배열 내에 존재하는지 파악할 때는 (python이라면 in을 썼겠지만) 4가지 방법을 사용한다.

1. anyMatch() 메서드를 사용하는 방법

int key = 30;
int[] arr = {10, 20, 30, 40, 50};
Arrays.stream(arr).anyMatch(i -> i == key);

인자값으로 람다식을 받는다. 포함한다면 true, 포함하지 않는다면 false를 리턴한다.

 

2. contains() 메서드를 사용하는 방법

int key = 30;
int[] arr = {10, 20, 30, 40, 50};
Arrays.asList(arr).contains(key);

먼저, 배열을 Arrays.asList()를 통해 리스트로 변환한 다음, 리스트에 포함하는지 확인한다.

 

3. binarySearch() 메서드를 사용하는 방법

int key = 30;
int[] arr = {10, 20, 30, 40, 50};

Arrays.sort(arr);
Arrays.binarySearch(arr, key);

먼저, 배열을 정렬하고 사용한다. binarySearch 결과 값이 존재한다면 0 이상을 리턴한다. 이진검색 알고리즘을 사용해 배열에 특정 값이 있는지 확인한다.