1205-s4 성공 & 이분탐색 총정리
This commit is contained in:
62
workbook_8708/1205-s4.py
Normal file
62
workbook_8708/1205-s4.py
Normal file
@@ -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이다.
|
||||
"""
|
||||
Reference in New Issue
Block a user