def solution(n, times):
answer = 0
# right는 가장 비효율적으로 심사했을 때 걸리는 시간
# 가장 긴 심사시간이 소요되는 심사관에게 n 명 모두 심사받는 경우이다.
left, right = 1, max(times) * n
while left <= right:
mid = (left+ right) // 2
people = 0
for time in times:
# people 은 모든 심사관들이 mid분 동안 심사한 사람의 수
people += mid // time
# 모든 심사관을 거치지 않아도 mid분 동안 n명 이상의 심사를 할 수 있다면 반복문을 나간다.
if people >= n:
break
# 심사한 사람의 수가 심사 받아야할 사람의 수(n)보다 많거나 같은 경우
if people >= n:
answer = mid
right = mid - 1
# 심사한 사람의 수가 심사 받아야할 사람의 수(n)보다 적은 경우
elif people < n:
left = mid + 1
return answer
def solution(n, times):
answer = 0
start, end, mid = 1, times[-1] * n, 0
while start < end:
mid = (start + end) // 2
total = 0
for time in times:
total += mid // time
if total >= n:
end = mid
else:
start = mid + 1
answer = start
return answer
![]
다른 사람의 풀이가 더 좋아서 가지고 왔다.
- start를 최소로 잡기
- 아직 범위를 잘 못잡는거 같다.
def solution(distance, rocks, n):
rocks.sort()
s, e, m = 0, distance, 0
answer = 0
while s <= e: # n 이 깨진 바위의 개수, 이분탐색은 거리로 한다.
m = (s + e) // 2
# print(m)
rock_cnt, start, flag, backup = 0, 0, True, 0
for rock in rocks: ## 마지막 도착점과의 거리를 생각하지 않았다
d = rock - start
if d < m: # 바위 파괴
rock_cnt += 1
else:
start, backup = rock, start # backup 에 그 전 start 위치 저장해놓기
if rocks[-1] == start: # 마지막 돌이 파괴 안되고, 목 적지와의 거리가 m 보다 작을 때 -> 마지막돌 파괴해야함
if distance - start < m:
rock_cnt += 1
start = backup # 스타트의 위치를 백업한 스타트의위치로 갱신해놓기
if distance - start < m: # 종점과의 거리가 기준치 m 보다 작을때 --> m 이 더 작아도 똑같이 파괴할수 있다는 뜻
flag = False # 이 m은 올바른 답이 아니라는 것을 표시
# rock_cnt : 거리의 최솟값의 최댓값이 m 이기 위해서 파괴되어야 하는 바위의 개수
## 거리의 최솟값의 최댓값이 유효하려면 바위 사이의 거리들중 일치하는 거리가 있어야 한다. --> 처리 안함
if n < rock_cnt: # 파괴한 바위가 많으면 -> m 줄어야
e = m - 1
else: # 파괴한 바위가 적거나 같을 때
if flag == False:
e = m - 1
else:
s = m + 1
answer = m
![]
다른 사람의 풀이가 더 좋아서 가지고 왔다.
- 진짜 아무리 봐도 이해가 안되는 문제..(레벨 4는 맵다매워)
- 프로그래머스의 질문하기 중 이해에 도움에 되었던 블로그를 참고하였다
- 덕분에 접근하는 방식에서 내가 뭘 잘못 했는지 알수 있었다.
- 이제는 참고하지 말고 내 머리로 풀고싶다..(에효효)