블로그 오랜만ㅎㅎ 3일만에 돌아왔다.
이번에 도전한 문제는 프로그래머스의 다리를 지나는 트럭이다. 이거 해결하는데 꼬박 하루는 걸린 거 같다.
이 문제는 큐로 풀어야 하기 때문에 리스트 형태에서 pop(0)을 사용하는 것은 비효율적이라는 말을 들었다. 그래서 덱 구조를 사용해보았는데, 테스트케이스 10개 중 1개가 자꾸 시간초과가 뜨는 거다...하하
결국 시영쌤의 도움을 받아 간신히 극복했다. 항상 감사합니다 쌤
그럼 우선 푼 코드 공유
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from collections import deque
def solution(bridge_length, weight, truck_weights):
answer = bridge_length
d = deque(truck_weights)
passing = deque()
passing_sum = 0
while d:
truck = d.popleft()
# 다리를 다 지난 트럭 빼기
if len(passing) == bridge_length:
tmp = passing.popleft()
passing_sum -= tmp
# 시간 재기
if passing_sum + truck <= weight:
passing_sum += truck
answer += 1
else:
answer += 1
d.appendleft(truck)
return answer
|
[해결 로직]
- deque 구조로 바꿔주고 truck_weights가 비어있을 때까지 while 반복문을 돌렸다. 즉 트럭들이 다리를 모두 건너면 멈춘다.
- passing 에는 다리를 건너는 트럭, passing_sum은 다리를 건너는 트럭의 무게합을 할당
- 시간을 재는 조건문에서 다리 위의 모든 트럭의 무게와 새로 가져온 트럭의 무게 합이 주어진 weight 보다 작거나 같은 경우에만 다리 위에 새로 가져온 트럭을 올려준다. ( + 시간 1씩 증가 )
- 그러나 weight 를 초과하면 다리 위에 다음 트럭을 올리지 않고 대신 그 자리를 0으로 채워준다. ( 이때도 시간은 +1씩 증가 )
- 첫번째 조건문을 통해 다리를 모두 지난 트럭은 빼준다. passing에서 해당 트럭 popleft로 빼주고 passing_sum에서도 동일하게 빼주기
[보완점]
- deque구조를 처음 써봤는데 stack과 queue를 모두 사용할 수 있는 것이 특징이라고 함
- 처음에 시간초과 났던 이유는 다음과 같다. 두 번째 조건문에서 sum_passing이라는 변수를 사용하기 전에 sum(passing) 값으로 비교를 했는데, 그렇게 되면 passing에 원소 하나가 추가 또는 삭제(업데이트) 될 때마다 계산을 처음부터 끝까지 다시 해야 하기 때문에 시간이 오래 걸렸다고 한다. 그래서 passing이라는 변수를 만들어 해당 원소만 추가 또는 빼주는 형태로 코드 변경해 통과할 수 있었다.
- sum때문에 시간초과가 뜰 거라고는 생각 못했는데, 아무래도 내장함수에 대한 기본적인 이해가 부족해서일 것이다. (라는 피드백을 받았는데 무척이나 공감이 된다 ㅠㅎ)
문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42583
코딩테스트 연습 - 다리를 지나는 트럭 | 프로그래머스
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다. 예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서
programmers.co.kr
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 멀쩡한 사각형 /파이썬 /python /최소공약수 (2) | 2020.08.07 |
---|---|
[프로그래머스] 스킬트리 / 파이썬 / python (0) | 2020.08.06 |
[프로그래머스] 오픈채팅방 / 파이썬 / python / 딕셔너리 배열 (1) | 2020.08.05 |
[프로그래머스] 소수찾기 / Python / 효율성 테스트 (1) | 2020.07.14 |
0303_프로그래머스 : 완주하지 못한 선수_해시 (0) | 2020.03.03 |