징검다리 | Lv.4
https://school.programmers.co.kr/learn/courses/30/lessons/43236


작성 코드 (시간 초과)
from itertools import combinations
def solution(distance, rocks, n):
answer = 0
rocks.sort()
# 제거할 rock을 combination으로 생성
combination = list(combinations(rocks, n))
for comb in combination:
min_dist = distance
before = 0
for rock in rocks:
# rock 이 comb에 없으면, 즉 제거할 바위가 아니면
if rock not in comb:
min_dist = min(min_dist, rock - before) // min_dist 갱신
before = rock // 해당 바위를 지났으니 before 갱신
min_dist = min(min_dist, distance - before)
answer = max(answer, min_dist)
return answer
- 당연히 시간 초과일 것이라 생각은 함...
- 어떤 기준으로 이분 탐색을 해야 할지 감이 안 잡힘
이상 코드
def solution(distance, rocks, n):
left, right = 0, distance
# rocks의 마지막 돌과 도착 돌 사이의 거리도 고려해야 함
rocks.append(distance)
rocks.sort()
while left <= right:
mid = (left + right) // 2
# 제거한 돌의 개수
del_stones_cnt = 0
# 거리를 잴 바로 이전의 돌
pre_stone = 0
for rock in rocks:
# 이전의 돌과의 거리가 mid 값보다 작다면
if (rock - pre_stone) < mid:
del_stones_cnt += 1 # 돌을 제거함
else: # 이전의 돌과의 거리가 mid 보다 크거나 같다면 해당 돌을 이후의 돌과 비교하도록 pre_stone 으로 지정
pre_stone = rock
# 만약 제거한 돌이 n보다 크다면 더이상 돌 필요가 없음
if del_stones_cnt > n:
break
# 만약 제거한 돌이 n보다 크다면 mid 값을 줄여야 함
if del_stones_cnt > n:
right = mid - 1
# 만약 제거한 돌이 n보다 작거나 같다면 mid 값을 늘려도 됨 (만족한다)
else:
left = mid + 1
return right
- answer은
1과distance사이!! → 최솟값이 될 수 있는 걸 이분탐색. 어차피 답은 그 안에 있으니! mid가 거리 차이의 최댓값이 된다면,mid보다 작은 값들도 후보임
5가 답(최소 거리 중 가장 큰 값)이라면 4도 당연히 답이 될 수 있음
but 5를 찾았는데 굳이 그 이하를 찾을 필요는 없음 어차피 가장 큰 값을 찾아야 하는 거니까!mid가 거리 차이의 최댓값이 되지 않는다면 (n개의 돌을 삭제하더라도 해당mid보다 작다면)mid보다 큰 값들은 당연히 답이 될 수 없음
5가 답을 만족 못 시켰는데 6은 당연히 만족 못 시킴
| 1 | 4 | 8 | 14 |
| mid = 5 : 거리 차이의 최솟값은 4로 mid 값(5)을 만족 못 시킴 → 당연 6은 불가능 mid = 3 : 거리 차이의 최솟값은 4로 mid 값(3)을 만족 시킴 → 당연 2는 가능 |
|||
반응형
'Algorithm > programmers' 카테고리의 다른 글
| [프로그래머스] 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.04.05 |
|---|---|
| [프로그래머스] 입국심사 (0) | 2023.05.19 |
| [프로그래머스] H-Index (0) | 2023.05.18 |
| [프로그래머스] 디스크 컨트롤러 (0) | 2023.05.17 |
| [프로그래머스] 더 맵게 (0) | 2023.05.15 |
댓글