728x90
https://school.programmers.co.kr/learn/courses/30/lessons/86053
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 문제분석
주어진 입력값이 상당히 크다면 이분탐색을 의심했어야했는데, 다른 방식으로 문제를 해결하려고 한참 해맸던 문제입니다.
시간을 기준으로 이분탐색을 하는데 해당 시간에 모든 금과, 은을 가져다 놓을 수 있는지 없는지 확인합니다.
- 금과 은을 모두 나를 수 있다면 시간을 좁혀 탐색해봅니다.
- 금과 은을 모두 나를 수 없다면 시간을 늘려 탐색해봅니다.
💻 코드
# <https://school.programmers.co.kr/learn/courses/30/lessons/86053>
# 시간을 기준으로 이분탐색한다.
import sys
def solution(a, b, g, s, w, t):
# 도시의 개수
n = len(g)
start = 1
end = sys.maxsize
answer = sys.maxsize
while end >= start:
mid = (start+end) // 2
total = 0
g_total = 0
s_total = 0
for i in range(n):
# 해당시간에 옮길 수 있는 횟수
cnt = mid // (t[i]*2)
# 편도로 갔다와야하는경우의 수 추가
if mid % (t[i]*2) >= t[i]:
cnt += 1
# 시간내에 옮길 수 있는 최대 무게
tmp = w[i] * cnt
total += min(tmp, g[i] + s[i])
g_total += min(tmp, g[i])
s_total += min(tmp, s[i])
# 옮길 수 있는지 확인 없다면 시간을 늘린다 그렇지 않다면 시간을 줄여본다.
if total >= a+b and g_total >= a and s_total >= b:
answer = min(mid, answer)
end = mid - 1
else:
start = mid + 1
return answer
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 징검다리 건너기 (0) | 2024.05.15 |
---|---|
[프로그래머스] 빛의 경로 사이클 (1) | 2024.05.12 |
[프로그래머스] 트리 트리오 중간값 (0) | 2024.05.11 |
[프로그래머스] 삼각달팽이 (0) | 2024.05.11 |
[프로그래머스] 기지국 설치 (0) | 2024.05.01 |