Files
baekjoon-study/workbook_8708/silver/19637-s3.py
2026-02-23 11:14:50 +09:00

58 lines
2.2 KiB
Python

# IF문 좀 대신 써줘
import sys
input = sys.stdin.readline
def binary_search(target, badge):
l, r = 0, len(badge)
while l < r:
mid = (l+r)//2
if badge[mid][1] >= target:
r = mid
else:
l = mid + 1
return l
def solution():
n, m = map(int, input().rstrip().split())
badge = []
name, value = input().rstrip().split()
badge.append((name, int(value)))
for i in range(n-1):
name, value = input().rstrip().split()
if badge[-1][1] == int(value):
continue
badge.append((name, int(value)))
for i in range(m):
target = int(input().rstrip())
idx = binary_search(target, badge)
print(badge[idx][0])
return
solution()
"""
걸린 시간: 40분
시간 복잡도: m개의 값에 대해 n범위에서 이분탐색을 진행하기 때문에 O(mlogn)
해설: 문제가 너무 단순해서 뭔가 했는데 n, m <= 10^5 이기 때문에 n에서 비교를 최대한 줄이는 것이 핵심이다.
n으로 만들어진 수직선 상에 m이 들어갈 위치를 찾으면 되기 때문에 이분탐색으로 진행한다.
10^5는 17정도에서 끝낼 수 있다. badge에 상한 값이 겹치는 애들은 첫번째만 넣고, m개 받으면서 이분탐색 진행
이분탐색 정리했는데 자꾸 헷갈리니까 다시 정리
내가 찾고자 하는건 badge의 idx이다. 즉 mid 기준으로 생각하는게 편하다.
지금 문제는 target이 어느 상한에 속하나인데, 100이라면 100이상의 상한을 찾아서 가장 먼저 나오는
상한값이 답인 것이다. 따라서 badge[mid][1] >= target으로 기본을 잡으면 되고,
저게 성립하면 mid는 답이 될 수 있지만 왼쪽에 답이 있을 수도 있다.
따라서 r을 움직여야하고, 현재 mid를 포함한 값이 되야 한다. r = mid
반대 상황은 badge가 target보다 작은거니까 현재 mid가 답이 될 수 없으므로 l = mid + 1
원소의 유무 판단이 아닌 들어갈 곳 찾기기 때문에 l, r = 0, len(badge)로 한다.
while문 기본 조건은 들어갈 자리를 찾는 것이기 때문에 l = r일때는 알아보는 것이 의미 없다. 따라서 while l < r
끝.
"""