https://www.acmicpc.net/problem/3020
import sys
input = sys.stdin.readline
def search_upper(arr, target) :
start, end = 0, len(arr)
while (start < end) :
mid = (start + (end - 1)) // 2
if arr[mid] <= target :
start = mid + 1
else :
end = mid
return len(arr) - end
n, H = map(int, input().split())
seok, jong = [], []
for _ in range(n // 2):
seok.append(int(input()))
jong.append(int(input()))
seok.sort()
jong.sort()
result = 1e10 #기준값
range_cnt = 0
for h in range(1, H + 1):
seok_cnt = search_upper(seok, h - 1)
jong_cnt = search_upper(jong, H - h)
cnt = seok_cnt + jong_cnt
if cnt < result :
result = cnt
range_cnt = 1
elif cnt == result :
range_cnt += 1
print(result, range_cnt)
upper bound와 lower bound의 개념을 몰라 처음 문제 접근부터 어려웠다. 후에 개념을 정리하고 막상 문제에 적용하자니 Solution에서 3번 이후로 문제 해결과정이 쉽지 않았다. 따라서 직접 그림을 그려가면서 문제를 해결하였다. 이 부분은 다른 문제를 풀어보면서 감각을 익혀야할 거 같다.
상한선(upper bound) : target보다 처음으로 큰 값이 나오는 위치를 리턴해주는 알고리즘
하한선(lower bound) : target보다 같거나 큰값이 처음 나오는 위치를 리턴해주는 알고리즘