https://www.acmicpc.net/problem/10815
문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <stdio.h> #include <stdlib.h> int compare(const void *num1,const void *num2) { if (*(int*)num1 < *(int*)num2) return -1; if (*(int*)num1 > *(int*)num2) return 1; else return 0; } int binary_search(int *arr,int N,int num) { int start = 0; int end = N; int mid = (start + end) / 2; while (start<=end) { if (arr[mid] == num) return 1; else if (arr[mid] < num) start = mid + 1; else end = mid - 1; mid = (start + end) / 2; } return 0; } int main() { int *arr, *arr2; int i; int N, M; scanf("%d", &N); arr = (int*)malloc(sizeof(int)*N); for (i = 0;i < N;i++) scanf("%d", &arr[i]); scanf("%d", &M); arr2 = (int*)malloc(sizeof(int)*M); for (i = 0;i < M;i++) scanf("%d", &arr2[i]); qsort(arr, N, sizeof(int),compare); for (i = 0;i < M;i++) { if (binary_search(arr, N, arr2[i])) printf("1 "); else printf("0 "); } } | cs |
퀵소트로 어레이 하나를 정렬시킨다음 이분탐색으로 그값을 찾으면 1 아니면 0을 출력했다
시간이 304ms 이다.
깔끔하게 짠거같지는않다..
'백준 알고리즘' 카테고리의 다른 글
[C언어] 백준알고리즘 15953번 상금 헌터 (카카오 코드 페스티벌 2018 예선) (0) | 2019.03.16 |
---|---|
[C언어] 백준알고리즘 10451번 순환 사이클 문제 (0) | 2019.03.16 |
[C언어] 백준알고리즘 2231번 분해합 문제 (0) | 2019.03.16 |
[C언어] 백준알고리즘 4948번 베르트랑 공준 문제 (에라토스테네스의 체) (0) | 2019.03.11 |
[C언어] 백준알고리즘 1065번 한수 문제 (0) | 2019.03.06 |