10/ 14 파이썬 공부
1. 백준 1920 수 찾기
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때,
이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다.
다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다.
다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다.
다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다.
모든 정수의 범위는 -2^(31) 보다 크거나 같고 2^(31)보다 작다.
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
>>>코드 시도 1
import sys
n = int(input())
A = list(map(int, sys.stdin.readline().split()))
m = int(input())
t = list(map(int, sys.stdin.readline().split()))
for i in range(m):
if t[i] in A:
print(1)
else:
print(0)
시간초과가 나온다.
pypy3
import sys를 모두 사용해도 그렇다.
>>>코드 정답 1
import sys
n = int(input())
A = set(map(int, sys.stdin.readline().split()))
m = int(input())
t = list(map(int, sys.stdin.readline().split()))
for i in range(m):
if t[i] in A:
print(1)
else:
print(0)
순서가 없는 set 함수를 이용하니 빠르게 정답이 나온다.
그러나...
뭔가 이렇게 푸는게 아닌 거 같아 찾아보니 이 문제는 이분탐색을 이용해야 한다고 나온다.
>>>이분탐색(이진 탐색)
이분 탐색 알고리즘은 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법으로,
배열 내부의 데이터가 정렬(보통은 오름차순) 되어 있어야 사용할 수 있는 알고리즘이다.
변수 3개 start, end, mid를 사용하여 탐색하는데,
데이터를 반복적으로 비교해서 원하는 데이터를 찾는 방법이다.
1. 리스트의 정렬
2. 중간값 mid와 Target 비교
3. 탐색범위 재설정 (Target이 mid보다 작으면 start와 mid 사이로, 크면 mid와 둥 사이로 재설정)
4. 2,3 단계 계속 반복
5. 중간값 mid와 Target이 같으면 mid return
>>>새로운 코드
# 입력은 동일
import sys
n = int(input())
A = list(map(int, sys.stdin.readline().split()))
m = int(input())
t = list(map(int, sys.stdin.readline().split()))
# 오름차순 정렬
A.sort()
for i in range(m):
# 처음과 마지막 인덱스 설정
start = 0
end = n-1
p = 0
# 이분 탐색 시작
while start <= end:
mid = (start+end)//2
# mid 와 Target(t[i])와 같으면 1출력 및 break
if t[i] == A[mid]:
p = 1
print(1)
break
# 같지 않다면 탐색범위 재설정
elif t[i] < A[mid]:
end = mid -1
else:
start = mid+1
if p == 0:
print(0)
'백준 > 백준 파이썬' 카테고리의 다른 글
| 백준 파이썬 30017번 치즈버거 만들기 (Today I Learn 2023.10.16) (0) | 2023.10.16 |
|---|---|
| 백준 파이썬 28352번 10! (Today I Learn 2023.10.15) (1) | 2023.10.15 |
| 백준 파이썬 28417번 스케이트보드 (Today I Learn 2023.10.13) (1) | 2023.10.13 |
| 백준 파이썬 29720 그래서 님 푼 문제 수가? (Today I Learn 2023.10.12) (1) | 2023.10.13 |
| 백준 파이썬 1110번 더하기 사이클 (Today I Learn 2023.10.11) (1) | 2023.10.13 |