폴더 분리
This commit is contained in:
58
workbook_8708/silver/19637-s3.py
Normal file
58
workbook_8708/silver/19637-s3.py
Normal file
@@ -0,0 +1,58 @@
|
||||
# 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
|
||||
끝.
|
||||
"""
|
||||
Reference in New Issue
Block a user