티스토리 뷰
https://www.acmicpc.net/problem/2776
2776번: 암기왕
연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,
www.acmicpc.net


👩💻문제 이해
이해하기에 어려운 문제는 아니다.
N개의 정수가 주어진 '수첩1'의 배열을 정렬한 후 '수첩2'에 들어있는 각각의 정수들을 이분탐색 알고리즘으로 '수첩1'에도 있는지 없는지를 판단하면 된다.
👩💻반복문을 사용해 이분탐색 알고리즘 구현 (함수 별도 구현) : 성공🌈
def binary(arr, target):
start = 0
end = len(arr) - 1
while start <= end:
mid = (start + end) // 2
if target == arr[mid]:
return 1
elif target <= arr[mid]:
end = mid - 1
else:
start = mid + 1
return 0
t = int(input())
for i in range(t):
n = int(input())
nli = list(map(int, input().split()))
nli = sorted(nli)
m = int(input())
mli = list(map(int, input().split()))
start = 0
end = len(nli) - 1
for j in mli:
print(binary(nli, j))
def binary(arr, target):
start = 0
end = len(arr) - 1
# start와 end는 모두 인덱스 값임에 유의
while start <= end:
mid = (start + end) // 2
if target == arr[mid]:
return 1
# 여기서 target은 수첩2에 있는 정수들
# target이 중간값과 같을 때 1 return
elif target <= arr[mid]:
# mid 또한 인덱스 값이므로 반드시 li[mid] 형태로 구현
end = mid - 1
else:
start = mid + 1
return 0
# 수첩1에 해당 정수가 존재하지 않을 때 0 return
t = int(input())
for i in range(t):
n = int(input())
nli = list(map(int, input().split()))
nli = sorted(nli)
m = int(input())
mli = list(map(int, input().split()))
start = 0
end = len(nli) - 1
for j in mli:
print(binary(nli, j))
✨Point✨
이분탐색 알고리즘에서 start, end, mid 변수가 인덱스 (값의 위치)일 때 li[start] 형태로 활용
'🦖 Programming > Python' 카테고리의 다른 글
[Python] ⭐️백준 알고리즘 11729번 : 하노이 탑 이동 순서 (0) | 2022.09.20 |
---|---|
[Python] 백준 알고리즘 2805번 : 나무 자르기 (0) | 2022.09.20 |
[Python] 백준 알고리즘 1654번 : 랜선 자르기 (0) | 2022.09.19 |
[Python] ⭐️백준 알고리즘 1018번 : 체스판 다시 칠하기 (0) | 2022.09.14 |
[Python] 백준 알고리즘 11478번 : 서로 다른 부분 문자열의 개수 (0) | 2022.09.13 |
댓글