import sys
N = int(sys.stdin.readline())
lst1 = set(map(int, sys.stdin.readline().split()))
M = int(input())
lst2 = list(map(int, sys.stdin.readline().split()))
result = []
for i in lst2:
if i in lst1:
result.append(1)
else:
result.append(0)
print(*result)
import sys
def binary_search(lst1, target, start, end):
while start <= end:
mid = (start + end) // 2
if lst1[mid] == target:
result.append(1)
return
elif lst1[mid] > target:
end = mid - 1
else:
start = mid + 1
result.append(0)
return
N = int(sys.stdin.readline())
lst1 = list(map(int, sys.stdin.readline().split()))
M = int(input())
lst2 = list(map(int, sys.stdin.readline().split()))
result = []
lst1.sort()
for e in lst2:
binary_search(lst1, e, 0, N - 1)
print(*result, end=' ')
solution 1을 살펴보자.
for i in lst2:
if i in lst1:
result.append(1)
else:
result.append(0)
lst2
와 같은 크기의 list result
를 만든 후 lst1
list 안의 값들이 lst2
list에 포함되어 있다면 해당 index 값을 1을 추가, 포함되어 있지 않다면 0을 추가한다.
solution 2는 binary search를 사용하여 풀었다.
* Binary Search Algorithm Example
Binary search algorithm을 python code로 작성하면 아래의 code와 같다.
def binary_search(lst1, target, start, end):
while start <= end:
mid = (start + end) // 2
if lst1[mid] == target:
result.append(1)
return
elif lst1[mid] > target:
end = mid - 1
else:
start = mid + 1
result.append(0)
return
while문으로 end가 start 보다 크거나 같을 때 동안 반복되고, start가 end보다 커지면 멈추도록 한다. 초기에 start와 end 값은 각각 lst1의 첫 번째 index의 값, lst1의 마지막 index의 값이 된다. 그 후 start와 end의 중간 값인 mid를 구한다. 만약 짝수를 2로 나누어 중간 값을 구하는 경우에는 몫을 나타낸다. 그다음으로 lst1[mid]
값을 구하여 찾고자하는 값인 target과 비교하여 lst1[mid] == target
의 경우에는 lst1에 원하는 target 값이 존재한다는 의미이기 때문에 result
에 1을 추가한다. 만약 lst1[mid]
가 target
보다 크다면 mid index보다 좌측에 위치해야하기 때문에 end point를 mid - 1
로 변경한다. 또는 lst1[mid]
가 target
보다 작다면 mid index보다 우측에 위치해야하기 때문에 start point를 mid + 1
로 변경한다. 조건식 start <= end
를 만족하는 동안에는 while문이 반복되고, start > end
가 되는 순간 lst1 안에 target 값이 없다는 의미이므로 result
에 0을 추가해준다.
result = []
lst1.sort()
for e in lst2:
binary_search(lst1, e, 0, N - 1)
Binary search를 사용하기 위해서 list의 값은 정렬되어있어야 하므로 lst1.sort()
로 lst1
를 정렬한다. 그 후 binary_search()
함수를 이용하여 lst2의 element : e
의 값이 lst1
list 안에 존재하는지 판별하여 존재한다면 result
list에 1을 추가하고, 존재하지 않는다면 0을 추가한다. For문이 모두 돌고나면 result
list에는 lst2
의 값에 대해 존재 여부를 나타내는 값이 0 or 1로 저장되어 있다. 이를 python asterisk '*'
를 이용하여 result
내의 값들을 분해하고, 한줄로 공백을 기준으로 순서대로 출력한다.
for i in range(n):
와 같이 range()
를 사용하는 경우에는 index를 의미하는 i
를 사용하는 것이 권장되고, for e in lst2:
와 같은 경우 index가 아니라 element를 받으므로 e
를 사용하는 것이 권장된다.
set()
자료형은 중복되는 element가 없게 하고, 순서가 없기 때문에 list
와 tuple
과 다르게 indexing이 불가능하다. set
자료형이 list
자료형보다 빠르다는 특징도 있다. set
자료형을 list
또는 tuple
로 변환하면 indexing이 가능해진다.