Data Science

[파이썬] 백준 1920 : list와 set의 시간복잡도 본문

알고리즘

[파이썬] 백준 1920 : list와 set의 시간복잡도

shinho0902 2022. 5. 18. 17:30

[파이썬] 백준 1920 : list와 set의 시간복잡도


문제

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안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

예제 입력 1

5
4 1 5 2 3
5
1 3 7 9 5

예제 출력 1

1
1
0
0
1

 

간단한 문제라고 생각했다.

하지만 문제에서 [모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.] 라는 조건에 있음에 유의하여야 했다.

 

 

기존 답안 (오답 : 시간초과)

n = int(input())
A = list(map(int,input().split()))
m = int(input())
B = list(map(int,input().split()))

for num in B:
    if num in A:
        print(1)
    else:
        print(0)

 

 

이유

파이썬에서 탐색시 시간복잡도가

list 자료형은 O(n) 이고

set 자료형은 O(1) 이다.

 

set은 해시 테이블로 구현 되어있기 때문에

탐색시 해당 값을 해시 함수에 넣어 인덱스에 접근함으로써 빠르게 해당값이 있는지 여부를 확인 할 수 있다.

 

탐색할 리스트를 세트형태로 변환하여 해결이 가능했다.

n = int(input())
A = list(map(int,input().split()))
m = int(input())
B = list(map(int,input().split()))

A = set(A)
for num in B:
    if num in A:
        print(1)
    else:
        print(0)

 

 

 

 

+ 참고

https://velog.io/@ready2start/Python-%EC%84%B8%ED%8A%B8set%EC%9D%98-%EC%8B%9C%EA%B0%84-%EB%B3%B5%EC%9E%A1%EB%8F%84

 

[Python] 세트(set)의 시간 복잡도

세트(set)의 시간 복잡도에 대해 알아보았다.

velog.io

 

Comments