Skip to content

20231115_JibinSong#16

Open
jibin86 wants to merge 3 commits intoDyeonPark:mainfrom
jibin86:main
Open

20231115_JibinSong#16
jibin86 wants to merge 3 commits intoDyeonPark:mainfrom
jibin86:main

Conversation

@jibin86
Copy link
Collaborator

@jibin86 jibin86 commented Nov 15, 2023

[이분탐색] 백준 2805 나무자르기

4 7
20 15 10 17

입력이 위와 같이 주어졌을 때, 상근이가 가져가야할 나무 길이는 7이고, 나무 높이(arr)는 [20, 15, 10, 17]이다.

절단기 높이를 인덱싱하고, 나오는 나무 길이를 비교하여 이분탐색을 한다.

절단기 높이가 20일 때, 나무 길이는 0이고, 높이가 20-7=13일 때 나무 길이가 7+2+4=13이다.

즉, 절단기 높이의 최댓값은 max(arr)이고, 최솟값은 max(arr)-(필요한 길이)로 둘 수 있다.

n, m = map(int, input().split())

arr = list(map(int, input().split()))

min_h = max(arr) - m  # 절단기 높이의 최솟값
max_h = max(arr)  # 절단기 높이의 최댓값

def count_length(mid):
  cnt = 0
  for i in arr:
    if i > mid:
      cnt += i - mid
  return cnt

while True:
  print(f"min: {min_h}, max: {max_h}, mid: {(min_h + max_h) // 2}")
  if min_h > max_h:
    print(max_h)
    break
  mid = (min_h + max_h) // 2
  cnt = count_length(mid)
  print(f"cnt: {cnt}")
  if cnt >= m:
    min_h = mid + 1
  else:
    max_h = mid - 1
min: 13, max: 20, mid: 16
cnt: 5
min: 13, max: 15, mid: 14
cnt: 10
min: 15, max: 15, mid: 15
cnt: 7
min: 16, max: 15, mid: 15
15

image

@jibin86
Copy link
Collaborator Author

jibin86 commented Nov 15, 2023

[이분탐색] 백준 12015 가장 긴 증가하는 부분 수열

문제에서 구해야하는 값은 가장 긴 증가하는 부분 수열이 아니라 수열의 길이이다.

입력 배열이 10 20 30 15 50 45 55 60 라고 해보자.

가장 긴 증가하는 부분 수열의 길이를 구하는 과정은 아래와 같다.

  1. 10 (10부터 배열에 넣기)
  2. 10 20 30
  3. 10 15 30 (30보다 작은 값 15 차례에는 15보다 크지만 가장 작은 값 20과 바꾼다.) ⇒ 정렬된 수열이기에 이분탐색으로 구한다.
  4. 10 15 30 50
  5. 10 15 30 45 (50보다 작은 값 45 차례에는 45보다 크지만 가장 작은 값 50과 바꾼다.)
  6. 10 15 30 45 55 60
  7. 위 배열의 길이를 구한다.
def get_idx(arr, key):  # key보다 크지만 가장 작은 값의 위치
  min_v = 0
  max_v = len(arr) - 1
  while True:
    if min_v > max_v:
      return min_v
    mid = (min_v + max_v) // 2
    if arr[mid] < key:
      min_v = mid + 1
    else:
      max_v = mid - 1

n = int(input())  # 10 20 30 15 20 25 50 45 55 60
array = list(map(int, input().split()))
result = [array[0]]

for i in array:
  if i > result[-1]:
    result.append(i)
  else:
    idx = get_idx(result, i)
    result[idx] = i

print(len(result))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant