본문 바로가기
매일매일 코딩연습!/프로그래머스

[코딩연습10일차] 프로그래머스 : 다리를 지나는 트럭 / python

by k-bonnie 2021. 2. 10.
728x90

 

오늘은 트럭문제군 🚚🚚🚚

 


 

문제 설명

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

 

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
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] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 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

풀이>

1. truck_weights의 길이 = list에 stack될 대기 요소들

2. bridge_length의 숫자 = stack할 list 길이

3. weight >= stack된 트럭 무게의 합 : 이 조건이 충족될때 list에 append하기

4. return = stack이 전부 pop()되기 까지 걸리는 시간. 

 

첨에 짠 코드... 이상한 에러가 남.

def solution(bridge_length, weight, truck_weights):
    answer = 0
    list = [0] * bridge_length[0] #다리길이 숫자를 인덱싱해서 list길이 만들어주기
    
    while list: #list안에서 일어나는 명령들
        answer += 1 #1초가 지나면
        list.pop(0) #맨 앞에 애를 하나씩 지워주고
        
        #다리 위에 트럭 올리기
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
        while truck_weights:
            if weight[0] >= sum(list) + truck_weights[0]:
                list.append(truck_weights.pop(0)) #list에 올려줌.
        
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
            else:
                list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
            
    return answer

TypeError: 'int' object is not subscriptable...?

 

구글링 해보니, 인덱싱해서 불러온 요소는 문자열로 읽히기 때문. 

그래서 처음에 list길이 만들때 bridge_length[0]이 아닌 그냥 bridge_length로 해준다.

밑에 weight[0]도 마찬가지로 weight로 변경.

 

참고: www.codeit.kr/community/threads/3084

 

코딩이 처음이라면, 코드잇

월 3만원대로 Python, JavaScript, HTML/CSS, Java 등 1,600개 이상 프로그래밍 강의를 무제한 수강하세요

www.codeit.kr:443

2차 시도 결과 >> ... 또 틀려서 숨겨버림....ㅋㅋㅋㅋ

더보기
def solution(bridge_length, weight, truck_weights):
    answer = 0
    list = [0] * bridge_length #다리길이 숫자를 인덱싱해서 list길이 만들어주기
    
    while list: #list안에서 일어나는 명령들
        answer += 1 #1초가 지나면
        list.pop(0) #맨 앞에 애를 하나씩 지워주고
        
        #다리 위에 트럭 올리기
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
        while truck_weights:
            if weight >= sum(list) + truck_weights[0]:
                list.append(truck_weights.pop(0)) #list에 올려줌.
        
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
            else:
                list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
            
    return answer

 

 

후훗,, 문자열이랑 정수랑 더하려해서 typeerror남... 그래서 이렇게 고쳐 봄.

list_weight라는 애를 추가 해 주었다.

def solution(bridge_length, weight, truck_weights):
    answer = 0
    list = [0] * bridge_length #다리길이 숫자를 인덱싱해서 list길이 만들어주기
    list_weight = 0 #다리 위에 무게 정수 선언
    
    while list: #list안에서 일어나는 명령들
        list_weight = sum(list)
        answer += 1 #1초가 지나면
        list.pop(0) #맨 앞에 애를 하나씩 지워주고
        
        #다리 위에 트럭 올리기
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 넘지 않을때
        while truck_weights:
            if weight >= list_weight + truck_weights[0]:
                list.append(truck_weights.pop(0)) #list에 올려줌.
        
        #(list에 올라간 무게+올릴트럭 무게)가 weight를 초과할 때
            else:
                list.append('0') #시간을 계속 세야하니까 그냥 넘기면 안됨. 대기하는 truck은 내비두고 0으로 채우기
            
    return answer

 

 

뭐지..ㅠ_ㅠ 하나 틀렸넹.... 뭐지무저ㅣㅇ 왜그러징...

 


결국 다른 분이 푼것 중에서 가장 이해가 잘 가는 것을 보고 고쳐서 풀음..

 

def solution(bridge_length, weight, truck_weights):
    list = [0] * bridge_length
    list_weight = 0
    answer = 0
    while truck_weights: #truck_weights가 소진될때까지 while이 돌아감.
        answer += 1 #시간 1초당 일어나는일들
        
        list_weight -= list.pop(0) #다리위의 총 무게에서 맨 앞꺼 하나씩 빼준다..(=다리를 통과한 것)
        
        if (list_weight + truck_weights[0]) <= weight:
            tw = truck_weights.pop(0) #기다리는애 처음꺼 뽑아서
            list.append(tw) #다리 위에 올리고
            list_weight+= tw #무게에 더한다.
            
        else: #무게 초과해서 못올리는경우
            list.append(0) #다리위에 0을 더한다(=트럭을 안올린다)
        
    answer += bridge_length
    #마지막 트럭이 다리를 빠져나오는 시간 더해주는 것.
    
    return answer

 

끝,,,ㅠ