일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파이썬
- programmers
- 정렬
- Set
- python
- 정규식
- java
- divmod
- 수학
- 동적 계획법
- backjoon
- KAKAO BLIND RECRUITMENT
- 그리디
- 이분탐색
- 자바
- lambda
- Zip
- 백준
- BFS
- 카카오
- 추석맞이 코딩챌린지
- 위클리 챌린지
- DateTime
- dfs
- 다익스트라
- 프로그래머스
- Re
- 재귀함수
- Combinations
- heapq
Archives
- Today
- Total
상상쓰
[프로그래머스] 금과 은 운반하기 본문
https://programmers.co.kr/learn/courses/30/lessons/86053?language=python3
월간 코드 챌린지 시즌3 문제로 프로그래머스 Level 3에 올라와 있다.
위의 해설을 참고하여 이분탐색으로 풀었다.
제한사항으로 봤을 때 a=10**9, b=10**9, g=[10**9], s=[10**9], w=[1], t=[10**5] 라 했을 때 가장 큰 시간이 걸릴 것이므로 end 를 약 10^15 로 잡으면 되겠다.
위의 해설을 참고하면 아래와 같이 풀 수 있는데,
a <= gM and b <= sM and a + b <= (gM + sm or sM + gm) (gM + sm = sM + gm) 일 때, 금 akg, 은 bkg 를 운반할 수 있는 이유에 대해서 간단히 말하자면
금을 akg 이상 운반할 수 있으면 그 아래의 무게는 전부 운반할 수 있다. 은도 마찬가지이다.
(a + b)kg 이상을 운반할 수 있다고 하면, 금은 akg 운반할 수 있으므로 akg만 운반하고 나머지는 다 은을 운반하는데 투자한다고 했을 때, 은 또한 bkg 이상을 운반할 수 있는 조건이 되기 때문에 bkg의 은을 운반할 수 있다.
def solution(a, b, g, s, w, t):
answer = float('inf')
start = 0
end = 10**9 * 10**5 * 4 - 10**5
while start <= end:
mid = (start + end) // 2
gM, gm, sM, sm = 0, 0, 0, 0
for i in range(len(t)):
c = (mid - t[i]) // (2 * t[i]) + 1
gM += g[i] if g[i] - c * w[i] <= 0 else c * w[i]
sm += min(s[i], abs(g[i] - c * w[i])) if g[i] - c * w[i] <= 0 else 0
sM += s[i] if s[i] - c * w[i] <= 0 else c * w[i]
gm += min(g[i], abs(s[i] - c * w[i])) if s[i] - c * w[i] <= 0 else 0
if gM >= a and sM >= b and gM + sm >= a + b:
end = mid - 1
answer = min(answer, mid)
else:
start = mid + 1
return answer
print(solution(10, 10, [100], [100], [7], [10])) # 50
'Coding Test' 카테고리의 다른 글
[추석맞이 코딩챌린지②] 정상 정복 (0) | 2021.09.20 |
---|---|
[추석맞이 코딩챌린지①] 피보나치수 (0) | 2021.09.19 |
[백준] 인형들 (0) | 2021.09.16 |
[백준] 어린 왕자 (0) | 2021.09.15 |
[백준] 최소공배수 (0) | 2021.09.14 |
Comments