문제
코드
My answer(시간초과)
import sys
input=sys.stdin.readline
n = int(input())
card=list(map(int,input().split()))
m=int(input())
array=list(map(int,input().split()))
for i in array:
if(i in card):print(1,end=" ")
else:print(0,end=" ")
My answer
import sys
n = int(input())
card=list(map(int,input().split()))
card.sort()
m=int(input())
array=list(map(int,input().split()))
def binary_search(target,start,end):
if(start>end):
return 0
mid=(start+end)//2
if(card[mid]==target):
return 1
elif(card[mid]<target):
return binary_search(target,mid+1,end)
elif(card[mid]>target):
return binary_search(target,start,mid-1)
for i in array:
answer=binary_search(i,0,len(card)-1)
print(answer,end=' ')
Another answer
import sys
n = int(input())
card=list(map(int,input().split()))
m=int(input())
array=list(map(int,input().split()))
_dict = {} # 속도는 dictionary!
for i in range(len(card)):
_dict[card[i]] = 0 # 아무 숫자로 mapping
for j in range(m):
if array[j] not in _dict:
print(0, end=' ')
else:
print(1, end=' ')
import sys
n = int(input())
card=list(map(int,input().split()))
card.sort()
m=int(input())
array=list(map(int,input().split()))
for check in array:
low, high = 0, n-1
exist = False
while low <= high:
mid = (low + high) // 2
if card[mid] > check:
high = mid - 1
elif card[mid] < check:
low = mid + 1
else:
exist = True
break
print(1 if exist else 0, end=' ')
풀이
우선 이 문제의 경우에도 여러가지 풀이 방법이 있었다.
첫번째 방법은 단순하게 파이썬의 내장함수 in을 이용하는 것이었는데, 내 카드를 순회하며 in을 통해 있는지 없는지만 확인하면 됐다. in의 경우에는 시간복잡도가 리스트에서는 O(N)이고, 집합이나 딕셔너리에선 O(1)~O(N)이다. 그러나 내 카드들 모두 확인해야하기 때문에 O(N^2)이 된다. 따라서 이 문제는 in을 사용하라는 문제가 아니었다.
두번째 방법은 이분탐색을 이용하는 것이었다. 이분탐색은 모든 숫자를 순회하지않기에
728x90
반응형
'코딩테스트 > 백준[Python]' 카테고리의 다른 글
[Python] 백준 #19637 - IF문 좀 대신 써줘 (1) | 2023.09.12 |
---|---|
[Python] 백준 #2417- 정수 제곱급 (0) | 2023.09.11 |
[Python] 백준 #1789- 수들의 합 (0) | 2023.09.11 |
[Python] 백준 #12851- 숨바꼭질 2 (0) | 2023.09.11 |
[Python] 백준 #1697- 숨바꼭질 (3) | 2023.09.08 |