58 lines
2.2 KiB
Python
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
|
|
끝.
|
|
""" |