📍 문제 설명
동빈이네 전자 매장에는 부품이 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 |