티스토리 뷰
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
1. 문제
2. 정답 코드
import sys
input = sys.stdin.readline # input()보다 빠른 sys.stdin.readline() 사용
# n
n = int(input())
ns = list(map(int, input().split()))
ns.sort() # 이진 탐색을 위한 오름차순 정렬
# m
m = int(input())
ms = list(map(int, input().split()))
for x in ms : # ms 리스트 내 모든 원소에 대해 이진 탐색 진행함
start, end = 0, n - 1
is_there = False # ns 리스트에 x 값이 존재하는지 표시하는 변수
while start <= end :
i = (start + end) // 2 # 중간 인덱스 설정
if x == ns[i] :
is_there = True
break
elif x < ns[i] : # x 값이 ns 중간값보다 작을 때
end = i - 1
else :
start = i + 1 # x 값이 ns 중간값보다 클 때
if is_there :
print(1)
else :
print(0)
- 처음에는 수를 찾기 위해 for문에서 'if x in ns'를 사용하였지만, 시간초과가 나왔다.
- in 연산자는 리스트의 경우 일일이 원소를 순회하기 때문에 시간 복잡도가 O(N)이다.
- 따라서 시간 복잡도가 O(logN)인 이진 탐색을 사용하였다.
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 11399번 ATM 파이썬 정답 코드 (0) | 2022.11.18 |
---|---|
[백준] 2839번 설탕 배달 파이썬 정답 코드 (0) | 2022.11.18 |
[1924번] 2007년 파이썬 정답 코드 (0) | 2022.04.26 |
[11650번] 좌표 정렬하기 파이썬 정답 코드 (0) | 2022.04.25 |
백준 단계별로 풀어보기 8단계 기본수학1 벌집 2292번 파이썬 정답 (0) | 2022.01.05 |