반응형
입력 조건
- 첫째 줄에 정수 N이 주어진. (1 ≤ N ≤ 1,000,000)
- 둘째 줄에는 공백으로 구분하여 N개의 정수가 주어진다. 이때 정수는 1보다 크고 1,000,000이하이다.
- 셋째 줄에는 정수 M이 주어진다. (1 ≤ M ≤ 100,000)
- 넷째 줄에는 공백으로 구분하여 M개의 정수가 주어진다. 이때 정수는 1보다 크고 1,000,000이하이다.
출력 조건
- 첫째 줄에 공백으로 구분하여 각 부품이 존재하면 yes를, 없으면 no를 출력한다.
입력 예시
5
8 3 7 9 2
3
5 7 9
출력 예시
no yes yes
앞선 이진탐색 알고리즘을 연습하기위해 재귀와 반복문 두가지 방법을 사용했고
추가적으로 만약 이걸 상관없이 풀었을 경우 코드 또한 풀었다.
1. 이진탐색 재귀
# 7-3 이진 탐색 부품 찾기 n = int(input()) data1 = list(map(int, input().split())) data1.sort() m = int(input()) data2 = list(map(int, input().split())) def binary_search(array, target, start, end): if start > end: return "no" mid = (start + end) // 2 if array[mid] == target: return "yes" elif array[mid] > target: return binary_search(array, target, start, mid - 1) else: return binary_search(array, target, mid + 1, end) for i in range(m): print(binary_search(data1, data2[i], 0, n-1), end=' ')
2. 이진탐색 반복문
# 7-4 이진 탐색 부품 찾기(반복문) n = int(input()) data1 = list(map(int, input().split())) data1.sort() m = int(input()) data2 = list(map(int, input().split())) def binary_search(array, target, start, end): while start <= end: mid = (start + end) // 2 if array[mid] == target: return "yes" elif array[mid] > target: end = mid -1 else: start = mid + 1 return "no" for i in data2: print(binary_search(data1, i, 0, n-1), end=' ')
우선 두 코드의 공통점으로는 쉬운 이진탐색을 위해 data1.sort()를 하였다는 것이다. 이 부분만 유의하면 될 것 같다.
3. 다른 방법
# 7-5 이진 탐색 부품 찾기(최적화) n = int(input()) data1 = list(map(int, input().split())) m = int(input()) data2 = list(map(int, input().split())) for i in data2: if i in data1: print("yes", end=' ') else: print("no", end=' ')
in 을 이용하여 풀었다.
반응형
'Algorithm > 이것이 코딩테스트다' 카테고리의 다른 글
[Python][이코테] 다이나믹 프로그래밍(DP) (0) | 2022.10.22 |
---|---|
[Python][이코테] 떡볶이 떡 만들기 (0) | 2022.10.17 |
[Python][이코테] 이진 탐색 (0) | 2022.10.13 |
[Python][이코테] 두 배열의 원소 교체 (0) | 2022.10.09 |
[Python][이코테] 성적이 낮은 순서로 학생 출력하기 (1) | 2022.10.08 |
댓글