상세 컨텐츠

본문 제목

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

Algorithm

by 쑤야. 2024. 1. 23. 14:15

본문

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근


  • 경과 시간마다 다리를 지난 새로운 트럭이 발생할 수 있으며, 다리를 건너고 있는 트럭이 발생할 수 있다
    1초마다 반복문 수행하며 점검
  • 동시에 여러 대가 다리를 지날 수 있으며, 각 트럭마다 시간을 체크해야 한다
    → 자료구조 를 사용하며, 트럭의 인덱스와 건너기 시작한 시간을 저장한다

로직


  • 현재 다리를 건너는 트럭 무게의 총합을 빠르게 접근하기 위해 변수를 선언한다
  • time을 0으로 초기화하여 repeat while문을 통해 1초마다 반복문을 수행해준다
  • 다리를 지난 트럭이 존재하는지 먼저 점검한다. 이후 새로운 트럭이 추가될 수 있는지 확인 후, 추가해준다

 

코드


1. Swift 풀이


func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {

    var cross = [(Int, Int)]() //(인덱스, 다리에 올라온 시간)
    var next = 0 //다음에 올라올 트럭 포인터
    var weightSum = 0 //다리에 올라와 있는 트럭들 무게 총합
    var time = 0
    
    repeat {
        
        time += 1
        
        //지난 트럭 제거
        if !cross.isEmpty && cross.first!.1 + bridge_length == time {
            let pass = cross.removeFirst()
            weightSum -= truck_weights[pass.0]
        }
        
        //새로운 트럭 추가
        if next < truck_weights.count && weightSum + truck_weights[next] <= weight {
            weightSum += truck_weights[next]
            cross.append((next, time))
            next += 1
        }
        
    } while !cross.isEmpty
    
    return time
}

 

2. Python 풀이


def solution(bridge_length, weight, truck_weights):
    
    cross = []
    next = 0
    weightTotal = 0
    time = 0
        
    while True:
        
        time += 1
        
        # 트럭 제거
        if len(cross) > 0 and cross[0][1] + bridge_length == time:
            weightTotal -= truck_weights[cross[0][0]]
            del cross[0]
        
        # 트럭 추가
        if next < len(truck_weights) and weightTotal + truck_weights[next] <= weight:
            cross.append([next, time])
            weightTotal += truck_weights[next]
            next += 1
        
        if len(cross) == 0 :
            break
    
    
    return time

관련글 더보기