![](https://blog.kakaocdn.net/dn/8LjWi/btrWbUDLjKy/XFfSFscStZbYoMxe1fKdP1/img.png)
🧩 문제 : 3020번
![](https://blog.kakaocdn.net/dn/xN5ZL/btrVT8hSHXh/W7fJleMTU7j5yCMdRoCAU0/img.png)
![](https://blog.kakaocdn.net/dn/B7vfx/btrVT6YDsF8/AuuuuMiKSM3madrQG7TSS1/img.png)
![](https://blog.kakaocdn.net/dn/7rClE/btrVTlPgxaf/G7thmVzueQ8Y60NCDJKjdk/img.png)
![](https://blog.kakaocdn.net/dn/dhaRJF/btrVU8OXUuh/vIOL7VKsKNUOkdwdqbNPSk/img.png)
![](https://blog.kakaocdn.net/dn/bypN5u/btrVWyl9E6K/ouOkBO6RZgk6NQZi1dgg21/img.png)
💪🏻 해결 방법
1️⃣ 석순과 종유석의 높이를 나누어 이분 탐색하자!
1. 석순과 종유석의 높이를 나누어 정렬
2. 개똥벌레가 나는 높이에 따라 파괴하는 장애물 개수 구하기
💥충돌 발생 조건
![](https://blog.kakaocdn.net/dn/rsnmS/btrV0hSoPaR/TjZ2NFFO1GTcoRdiTSO4k1/img.png)
3. 최소 장애물 개수를 구하고, 그 구간의 개수 구하기
정답 코드
# 입력
N, H = map(int, input().split()) # 동굴 길이, 높이
down = [] # 석순의 높이
up = [] # 종유석의 높이
for i in range(N):
if i % 2 == 0:
down.append(int(input()))
else:
up.append(int(input()))
count = 0 # 최소 충돌 구간 개수
min_crash = N # 최소 장애물 충돌 개수
# 정렬
down.sort()
up.sort()
def binary_search(array, target, start, end):
while start <= end:
mid = (start + end) // 2
if array[mid] >= target:
end = mid - 1
else:
start = mid + 1
return len(array) - start
for fly in range(1, H + 1):
up_crash = binary_search(up, fly - 0.5, 0, len(up)-1)
down_crash = binary_search(down, H - fly + 0.5, 0, len(down)-1)
crash = up_crash + down_crash
if min_crash == crash:
count += 1
elif min_crash > crash:
count = 1
min_crash = crash
print(min_height, count)
🎁 성공!
![](https://blog.kakaocdn.net/dn/n0gtW/btrVWzrRdHb/F7UnIfLQi7CnwKIWWGGZr1/img.png)
'알고리즘' 카테고리의 다른 글
정렬 알고리즘 #선택 정렬/삽입정렬/퀵 정렬/계수 정렬 (0) | 2023.01.14 |
---|---|
[BOJ / Python] 2251 물통 (0) | 2023.01.14 |
[BOJ / Python] 1541 잃어버린 괄호 (0) | 2023.01.09 |
[BOJ / Python] 1931 회의실 배정 (0) | 2023.01.09 |
[BOJ / Python] 5904 Moo 게임 (0) | 2023.01.07 |