728x90
반응형

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)






728x90
반응형

+ Recent posts