| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 문자열
- 알고리즘
- DP
- graph
- Greedy
- DVWA
- 탐욕법
- 그래프
- programmers
- BFS
- 동적계획법
- sort
- DFS
- Queue
- Algorithm
- 코딩테스트
- 힙
- 카카오 기출
- Brute Force
- 완전탐색
- 정렬
- string
- 프로그래머스
- heap
- 백준
- django
- 큐
- binary search
- Dynamic Programming
- Code Refactoring
- Today
- Total
생각과 고민이 담긴 코드
프로그래머스 - 다리를 지나는 트럭(Stack / Queue) / Level 2 본문
문제
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.
예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6] kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
| 경과 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기 트럭 |
| 1~2 | [] | [7] | [4,5,6] |
| 3 | [7] | [4] | [5,6] |
| 4 | [7] | [4,5] | [6] |
| 5 | [7,4] | [5] | [6] |
| 6~7 | [7,4,5] | [6] | [] |
| 8 | [7,4,5,6] | [] | [] |
| 0 | [] | [] | [7,4,5,6] |
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight,
트럭 별 무게 truck_weights가 주어집니다.
이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
제한 사항
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
입출력 예
| bridge_length | weight | truck_weights | return |
| 2 | 10 | [7,4,5,6] | 8 |
| 100 | 100 | [10] | 101 |
| 100 | 100 | [10,10,10,10,10,10,10,10,10,10] | 110 |
풀이
def solution(bridge_length, weight, truck_weights):
answer = 0
bridge_on = [0] * bridge_length
curr_weight = 0
while truck_weights:
answer += 1
bridge_out = bridge_on.pop(0)
curr_weight -= bridge_out
if curr_weight + truck_weights[0] > weight:
bridge_on.append(0)
else:
truck = truck_weights.pop(0)
bridge_on.append(truck)
curr_weight += truck
while curr_weight > 0:
answer += 1
bridge_out = bridge_on.pop(0)
curr_weight -= bridge_out
return answer
지금까지 풀었던 프로그래머스 중 제일 어려웠다.
트럭이 단위 시간당 1만큼 이동한다는 조건도 없어서 트럭이 다리를 건너는데 몇 초가 걸리는지도 명확하지 않았다.
여러 풀이를 시도해봤지만 조건문 내에서 sum() 함수를 쓰는 부분이 시간 복잡도에 안 좋은 영향을 끼쳤다.
따라서 완벽한 풀이를 하지 못했고 다른 사람의 풀이를 살펴보겠다.
이 풀이에서 가장 중요한 점은 바로 curr_weight라는 변수이다.
이 변수는 중요한 2가지 역할을 하는데 다리 위에 있는 트럭들의 무게를 관리함으로써
첫 번째로 sum()를 쓸 필요가 없어졌다. sum()은 시간 복잡도가 O(n)으로 반복문 내에서 존재하기만 해도
전체 시간 복잡도가 O(n^2)으로 치솟을 수 있다.
두 번째로 truck_weight 리스트에 있는 모든 트럭들이 출발하고 나서
다리 위에 있는 트럭들만 따로 처리할 수 있도록 반복문을 2개로 나눌 수 있다.
그렇게 하면 두 번째 반복문에서는 조건 처리가 단순해지기 때문에 시간 복잡도를 줄일 수 있다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| 프로그래머스 - 더 맵게(Heap) / Level 2 (4) | 2021.08.09 |
|---|---|
| 프로그래머스 - 주식가격(Stack/Queue) / Level 2 (0) | 2021.08.08 |
| 프로그래머스 - 프린터(Stack / Queue) / Level 2 (0) | 2021.08.01 |
| 프로그래머스 - 기능개발(Stack / Queue) / Level 2 (0) | 2021.07.31 |
| 프로그래머스 - 베스트앨범(Hash) / Level 3 (0) | 2021.07.26 |