본문 바로가기
Python3/백준 알고리즘

2022.02.23 [백준] (python 파이썬) 수 찾기

by ian's coding 2022. 2. 23.
728x90
반응형

 

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

 


풀이

2가지 방법으로 문제를 해결했다.

 

1. 이분 탐색

먼저 이분탐색은 배열이 정렬된 상태에서 가능하기 때문에 arr배열을 정렬 후, 

시작과 끝 인덱스를 first, last로 지정한다. 

시작과 끝의 중간지점을 mid로 지정 후, mid값과 value를 비교한다.

만약 값이 동일하다면 1일 출력해주고,

mid값이 크다면 value와 같은 값은 mid값보다 앞에 있으므로 last를 mid-1로 바꿔준다. 

또는 mid값이 작다면 value와 같은 값은 mid값보다 뒤에 있으므로 first를 mid+1로 바꿔준다.

이렇게 범위를 줄여가면서 해당 값을 찾아준다.

만약 while문이 다끝나도 찾지 못했으면 arr배열에 value값이 없으므로 0을 리턴해준다.

출처 : https://dongdd.tistory.com/50

1. 이분 탐색 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
n=int(input())
arr=list(map(int,input().split()))
arr.sort()
m=int(input())
arr2=list(map(int,input().split()))
 
def binary_search(arr,value):
    first=0
    last=n-1
 
    while first<=last:
        mid=(first+last)//2
        if arr[mid]==value:
            return 1
        if arr[mid]>value:
            last=mid-1
        else:
            first=mid+1
    return 0
 
 
for i in arr2:
    print(binary_search(arr,i))
cs

 

2. 집합 자료형

이분탐색을 쓰지 않고도 풀 수 있을거같아 처음에 list를 이용해서 in arr을 통해 포함여부를 판단하여 1 또는 0을 출력했다. 하지만 시간 초과가 발생하였고 시간 복잡도를 알아본 결과 list의 포함여부판단은 O(N)이 걸린다는것을 알게 되었다. 그래서 다른 집합 자료형을 알아보던 중, set을 사용하면 포함여부판단이 O(1)이 걸린다는 것을 알고 set을 이용하여 코드를 작성하였다.

 

탐색과 조회가 주된 목적이면 딕셔너리나 set을 이용하자!!!

https://chancoding.tistory.com/43

 

[Python] 파이썬 자료형 및 연산자의 시간 복잡도(Big-O) 총 정리

시간 복잡도를 알아야 하는 이유 백준에서 알고리즘을 풀다 보니 '시간 초과'되는 경우를 자주 겪었습니다. 문제를 풀고 나서도 결과 시간이 다른 사람들보다 상당히 높게 나오는 경우가 있었는

chancoding.tistory.com

 

2. 자료형 코드

1
2
3
4
5
6
n=int(input())
arr=set(input().split())
m=int(input())
arr2=input().split()
for i in arr2:
    print(1 if i in arr else 0)
cs

 

 

728x90
반응형

댓글