문제 설명
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
# 시도
다리에 올라간 트럭의 위치를 리스트로 만들어서 처리하려했는데, 아놔 오래걸린다고.. 채점도 안해줌 ㅠㅠ
def solution(bridge_length, weight, truck_weights):
answer = 0
arrived = 0 # 도착한 트럭 수
n = len(truck_weights) # 전체 트럭 수
w = 0 # 현재 다리의 무게
time = 0 # 소요된 시간
location = [0] * n # 각 트럭의 위치
temp = [1] * n
i = 0
now_bridge = []
while True:
time = time + 1
# 다리에 있는 트럭의 위치 +1
if w + truck_weights[i] <= weight:
now_bridge.append(i)
w = w + truck_weights[i]
i = i + 1
for t in now_bridge:
location[t] = location[t] + 1
if location[t] >= bridge_length:
del now_bridge[t]
arrived = arrived + 1
weight = weight - truck_weights[t]
if arrived == n:
break
return time
# 풀이
똑똑한 다른 블로그 염탐 결과, pop(0) 이 포인트~
대단하네~ 내 코드 눈감아...
주석을 추가했습니다요~
pop과 del의 차이? remove하는 것은 똑같은데 pop은 return 값이 있다.
def solution(bridge_length, weight, truck_weights):
time = 0 # 소요 시간
bridge = [0] * bridge_length # 다리에 올라온 트럭의 위치
while len(bridge) != 0:
# 더 이상 남은 트럭이 없으면(무게가 넘든 안 넘든 남은 트럭이 있으면 0이 아님)
time += 1
print("pre_bridge >> ", bridge)
bridge.pop(0)
# bridge의 맨 앞 요소를 pop 하므로써, 1씩 움직이는 걸 구현한다.
print("time >> ", time)
print("bridge >> ", bridge)
print("truck_weights >> ", truck_weights)
print("sum(bridge) >> ", sum(bridge))
if truck_weights:
if sum(bridge) + truck_weights[0] <= weight:
bridge.append(truck_weights.pop(0))
# 다리에 올라오지 않은 트럭을 pop(0)함으로써 인덱스 처리를 하지 않아도 된다.
else:
bridge.append(0)
# 무게가 넘으면 다리에 올라올 수 없으므로 0으로 채운다.
return time
'Algorithm > Practice' 카테고리의 다른 글
프로그래머스 - 기능개발 (Python) (0) | 2021.04.08 |
---|---|
프로그래머스 - 주식가격 (Python) (0) | 2021.03.30 |
프로그래머스 - 고득점 SQL Kit (0) | 2021.03.11 |
백준 알고리즘 - 1339 단어 수학 (JAVA) (0) | 2020.11.29 |
백준 알고리즘 - 2309 일곱 난쟁이 (JAVA) (0) | 2020.11.29 |