From c679c7f4811851ff8d279648f96b8c0be48969a5 Mon Sep 17 00:00:00 2001 From: nkey Date: Tue, 27 Jan 2026 15:19:05 +0900 Subject: [PATCH] =?UTF-8?q?1205-s4=20=EC=84=B1=EA=B3=B5=20&=20=EC=9D=B4?= =?UTF-8?q?=EB=B6=84=ED=83=90=EC=83=89=20=EC=B4=9D=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_8708/1205-s4.py | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 workbook_8708/1205-s4.py diff --git a/workbook_8708/1205-s4.py b/workbook_8708/1205-s4.py new file mode 100644 index 0000000..3dd27ba --- /dev/null +++ b/workbook_8708/1205-s4.py @@ -0,0 +1,62 @@ +# 등수 구하기 + +import sys + +input = sys.stdin.readline + + +def binary_search(lst, v): + start, end = 0, len(lst) + + while start < end: + mid = (start+end) // 2 + if lst[mid] <= v: + end = mid + else: + start = mid+1 + + return start + +def solution(): + n, new_score, p = map(int, input().rstrip().split()) + + if n == 0: + print(1) + return + + scores = list(map(int, input().rstrip().split())) + + + if n == p and new_score <= scores[-1]: + print(-1) + return + + result = binary_search(scores, new_score) + + print(result+1) + + return + + +solution() + + +""" +걸린 시간: 1시간 (이분탐색 여러 종류를 공부하면서 하느라 좀 걸렸다..) + +시간 복잡도: O(logn) + +해설: 이분탐색으로 들어갈 곳을 정하고, 이때, 값이 같다면 맨 앞에 놓을 수 있도록 처음으로 lst[mid] > target이 되는 곳을 찾으면 된다. +이게 이분탐색 lower_bound이다. 여기서 찾고자 하는 것과 배열 상태에 따라 조건을 잘 설정해야되는데, 우리가 원하는 것은 3번이다. +오름차순이라면 x 이상, 초과를 찾을 것이고, 내림차순이라면 x 이하, 미만을 찾는 것이 일반화하는데 편하다. +1. 오름차순 배열에서 처음 x 이상을 찾는다면 lst[mid] >= x 이고, mid도 답이 될 수 있고, 왼쪽도 확인해봐야 하기 때문에 r = mid가 된다. +2. 오름차순 배열에서 처음 x 초과를 찾는다면 lst[mid] > x 이고, mid가 답이 될 수 있고, 왼쪽도 확인해봐야 하기 때문에 r = mid가 된다. +3. 내림차순 배열에서 처음 x 이하를 찾는다면 lst[mid] <= x 이고, mid가 답이 될 수 있고, 왼쪽도 확인해봐야 하기 때문에 r = mid가 된다. +4. 내림차순 배열에서 처음 x 미만을 찾는다면 lst[mid] < x 이고, mid가 답이 될 수 있고, 왼쪽도 확인해봐야 하기 때문에 r = mid가 된다. + +아무튼 가장 중요한 것은 현재 mid가 답이 될 수 있는가에 대한 여부와 왼쪽과 오른쪽 중 어디가 답 가능성이 있는 방향인지를 보면 +1. if 조건과 r, l의 매칭 & 2. r, l에 mid +1을 할지 말지를 정할 수 있다. + +그 외에 이 문제는 경계에 대한 것이었기 때문에 l < r 조건에 [l, r) 구간이었는데, +원소를 특정하는 것은 mid를 보고 아니면 버리기 때문에 mid +-1은 항상 해주고, 구간도 [l, r]에 조건도 l <= r이다. +""" \ No newline at end of file