상세 컨텐츠

본문 제목

다리를 지나는 트럭 파이썬

알고리즘 공부

by 독서와 여행 2021. 3. 23. 00:14

본문

아오 이건 며칠간 고민했는데 못 풀었다.

 

out of index로 싸움하고 나중에는 음 만약 길이 2인 다리를 차 1대만 지나가면 2초가 아니라 총 3초가 필요한데

 

그 다음부터는 2초면 끝난다. 이걸 또 어떻게 처리할까로 고민하다 너무 짜증나서 그냥 답을 봐버렸다.

 

답 보고 공부나 해야지. 내 실력이 이것 밖에 안되니 더 열심히 해야겠다.

 

할 것도 많은데 자꾸 시간 낭비를 어디선가 한다. 최대한 낭비를 줄이자. 아래는 내 코드인데

 

계속 이런 식으로 접근했다. 머 class도 써보고 별의 별 방식으로 접근했다.

 

def solution(bridge_length, weight, truck_weights):
    time = 0 
    end_num = len(truck_weights)
    time_num = 0
    end_list = []
    on_bridge = []
    on_bridge_time = [0]

    
    while len(end_list) != end_num :
        
        if on_bridge_time[time_num] == bridge_length:
            end_list.append(on_bridge[0])
            del on_bridge[0]
            time_num += 1
            
        
        
        if sum(on_bridge) + truck_weights[0] <= weight:
            on_bridge.append(truck_weights[0])
            truck_weights.sort(reverse=True)
            if on_bridge_time[time_num] != 0:  # 처음을 위해서 
                on_bridge_time.append(0)
        
        
        on_bridge_time = [x + 1 for x in on_bridge_time]
        
        time += 1
    
    return time

 

 

아래 코드는 블로그에서 가져왔는데

 

이걸 보고 코드가 처음에는 이해가 잘 안 갔다. 그래서 주석으로 해설을 좀 해놨다.

 

def solution(bridge_length, weight, truck_weights):
    time = 0
    q = [0] * bridge_length
    
    while q:
        time += 1
        q.pop(0) # 시간이 흐름에 따라 1칸 움직임
        if truck_weights: #트럭 들이 다 있는 동안
            if sum(q) + truck_weights[0] <= weight: # 다리에 있는 차 무게 + 대기 차 1번 무게
                q.append(truck_weights.pop(0)) #대기 차 빼서 다리에 넣음
            else:
                q.append(0) #다리에 차가 안 들어오면 한 칸 앞으로 움직임
    
    return time

 

와 이거 처음 보고 이해했을 때 코드를 보지 않고는 나는 절대 생각 못 했겠지라는 생각이 들었다.

 

이 코드가 작동하는 모습을 머릿속으로 그려보면 근데 정말 차가 도로를 지나가는 느낌이라 재미있다.

 

나도 pop을 쓸껄. pop 쓰면 index 문제 없이 잘 구현할 수 있었겠다.

 

아래는 다른 코드다. 여기서도 pop을 썼다. 이건 조금 이해하기 어려웠는데 주석을 넣어보며 이해를 해봤다.

 

핵심은 내가 pop()을 생각 못 해서 자꾸 이상하게 했다는 거다. 뭔가 코드 작성할 때는 아래 코드가 더 작성은 쉬울 것 같기도 하다. 내일 다시 풀어봐야겠다

 

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) #bridge_on 한 칸 전진
        curr_weight -= bridge_out  #차가 있으면 차량 무게만큼 - 없으면 0 -

        if curr_weight + truck_weights[0] > weight: #다리에 있는 무게가 더 많이 나가면 pass
            bridge_on.append(0)
        else:
            truck = truck_weights.pop(0) #다리에 트럭이 탈 수 있으면 append
            bridge_on.append(truck)
            curr_weight += truck


    while curr_weight>0:  # 트럭이 on_bridge인 경우 curr_weight 이 0이되어 다 빠질 때 까지
        answer +=1
        bridge_out = bridge_on.pop(0)
        curr_weight -=bridge_out

    return answer

출처 : assaeunji.github.io/python/2020-05-08-pgtruck/

 

[프로그래머스] 다리를 지나는 트럭 파이썬 풀이

풀이시간: 30분 분류: 스택/탑 링크: [link]

assaeunji.github.io

 

 

관련글 더보기

댓글 영역