Learn to share,Share to learn
리스트 입력 여러개 받기과 이진탐색 본문
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 = int(input())
A = list(map(int, input().split()))
M = int(input())
X = list(map(int, input().split()))
이렇게만 평소에 입력 받아서 몰랐는데,
list = []
list.extend(map(int,input().split()))
과 같이 같은경우, extend를 이용해서 여러개를 받을수도 있었다.
이 문제는 이진 탐색문제인데, 실제 시간복잡도를 고려하지 않고 구현한다면
# 입력 처리
N = int(input())
A = list(map(int, input().split()))
M = int(input())
X = list(map(int, input().split()))
# 각 숫자에 대해 배열 A 안에 존재하는지 확인
for x in X:
print(1 if x in A else 0)
짠 이렇게 심플하게 작성할수 있겠다. 물론 터진다.
def binary_search(arr, x):
low = 0
high = len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == x:
return 1
elif arr[mid] < x:
low = mid + 1
else:
high = mid - 1
return 0
# 입력 처리
N = int(input())
A = list(map(int, input().split()))
M = int(input())
X = list(map(int, input().split()))
# 배열 A 정렬
A.sort()
# 각 숫자에 대해 이진 검색 수행
for x in X:
print(binary_search(A, x))
이진탐색을 이용
import bisect
# 입력 처리
N = int(input())
A = sorted(map(int, input().split())) # 정렬된 상태로 입력 받기
M = int(input())
X = map(int, input().split())
# 각 숫자에 대해 이진 검색 수행
for x in X:
# bisect_left는 x가 삽입될 가장 왼쪽 위치를 반환
# bisect_right는 x가 삽입될 가장 오른쪽 위치를 반환
left = bisect.bisect_left(A, x)
right = bisect.bisect_right(A, x)
# 만약 left와 right가 같다면, x는 리스트에 존재하지 않는 것
# 존재한다면, left와 right는 다른 값을 가질 것임
print(1 if left != right else 0)
파이썬 내장함수 이용까지 짚고 넘어가자
'알고리즘' 카테고리의 다른 글
join함수 이해 (0) | 2024.01.26 |
---|---|
부분합 (0) | 2024.01.25 |
1181 집합 원소 길이별 정렬 (1) | 2024.01.25 |
DFS,BFS (2) | 2024.01.25 |
람다, 그리고 sorted와 split (1) | 2024.01.24 |