일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 시드니
- 호주
- scapesydneycentral
- 교환학생
- 1421번
- 호주비자신체검사
- 철도공학
- 교환학생짐싸기
- Scape
- 호주학생비자
- 군전세객차
- 교통안전법
- 열차운전
- 운전이론
- 나무꾼이다솜
- c언어
- 교통안전관리론
- C++
- 호주휴대폰개통
- 교통법규
- UTS
- 호주기숙사
- 교환학생짐싸기리스트
- 시드니기숙사
- subclass500
- 철도교통안전관리자
- BOJ
- 백준
- C
- 교환학생짐
- Today
- Total
탐정사무소
1920번 수 찾기(C) 본문
실버문제를 하나씩 해결해보자
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
사전지식
브론즈 문제 풀 때 시간복잡도라는 것인지 뭔지 걸려서, 단순히 앞에서부터 순서대로 탐색을 하게 되면 시간이 초과되는 경험을 해 본 적 있다...이 문제도 역시 이진 탐색을 활용해서 문제를 풀어야 하나 보다.
자료구조도 아직 배웠는데 이진 탐색을 쓰려 하니...오랜만에 1학기 수업 ppt를 꺼낼 수 밖에 없었다.
왼쪽 인덱스(left)와 오른쪽 인덱스(right), 중간 인덱스(middle)를 설정한다. middle=(left+right)/2 로 구하고,
ⓐ 구하고자 하는 값 < middle : right=middle-1
ⓑ 구하고자 하는 값 > middle : left=middle+1
ⓒ 구하고자 하는 값 = middle : middle이 답
해결과정
1. 이진탐색에는 전제가 하나 있었다. 바로 데이터 집합이 사전에 정렬돼있어야 한다는 것이다.
C++에서는 sort함수라고 있는가본데, C에는 그게 없기 때문에 대체재를 찾아다녔다.
퀵 정렬이 <stdlib>에 함수로 있다는 사실을 알았다.
그래서 코딩도장님 자료보고 퀵 정렬 함수를 사용했다.
https://dojang.io/mod/page/view.php?id=638
C 언어 코딩 도장: 73.2 퀵 정렬 함수 사용하기
이번에는 퀵 정렬 함수를 사용해보겠습니다. 퀵 정렬 함수에는 정렬할 배열 또는 메모리의 주소, 요소 개수, 요소 크기, 비교 함수를 넣어줍니다(stdlib.h 헤더 파일에 선언되어 있습니다). qsort(정
dojang.io
2. 그리고 이진 탐색에 계속 오류가 나서...하늘서랍님 코드가 비록 C++이지만 아이디어만 얻는 겸 해서 나는 C로 작성했다.
https://artiper.tistory.com/96?category=951644
백준 1920번 수 찾기 [C/C++]
1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지
artiper.tistory.com
코드
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
int num1 = *(int*)a;
int num2 = *(int*)b;
if (num1 < num2) return -1;
else if (num1 > num2) return 1;
else return 0;
}
int BinarySearch(int left, int right, int key, int *arr) {
int middle;
while (left <= right) {
middle = (left + right) / 2;
if (key < arr[middle]) right = middle - 1;
else if (key > arr[middle]) left = middle + 1;
else return 1;
}
return 0;
}
int main() {
int n, m;
int i;
int A[100000], B[100000];
int result = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &A[i]);
scanf("%d", &m);
for (i = 0; i < m; i++)
scanf("%d", &B[i]);
qsort(A, n, sizeof(int), compare);
for (i = 0; i < m; i++) {
result = BinarySearch(0, n - 1, B[i], A);
printf("%d\n", result);
}
return 0;
}
결과
'학과공부 > 백준' 카테고리의 다른 글
2108번 통계학(C) (0) | 2021.08.15 |
---|---|
1978번 소수 찾기(C) (0) | 2021.08.14 |
1966번 프린터 큐(C) (0) | 2021.08.12 |
1929번 소수 구하기(C) (0) | 2021.08.12 |
15552번 빠른 A+B(C/C++) (0) | 2021.08.11 |