diff --git a/workbook_8708/19637-s3.py b/workbook_8708/19637-s3.py new file mode 100644 index 0000000..5a42e2c --- /dev/null +++ b/workbook_8708/19637-s3.py @@ -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() + +""" +걸린 시간: 7:07~ + +시간 복잡도: + +해설: 문제가 너무 단순해서 뭔가 했는데 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 +끝. +""" \ No newline at end of file