ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 다리를 지나는 트럭 프로그래머스 코딩테스트
    개발/Swift 2022. 1. 9. 17:49

    필요한 변수들은 다음과같다.

    1. 트럭 대기 배열
    2. 다리위에 있는 트럭 배열
    3. 경과 시간
    4. 남은 시간 배열
    5. 다리위에 있는 트럭무게의 합

    해결방법

     

    반복문을 하나 만든다 이 반복문은 트럭 대기 배열, 다리위 트럭 배열이 모두 비었을때

    반복 중지되고 결과값이 리턴된다.

     

    1시간이 지났으므로 시간 배열값 -1씩 해주고(시간배열 비어있지 않은경우)

    배열 맨앞의 값이 0이면 다리를 지났다는 의미 이므로

    시간배열, 다리위 배열에서 제거하며, 해당 무게를 현재 다리위 트럭들 무게 에서 빼준다.

     

    대기배열에 트럭이 남아있다면

    현재 가용한 무게(다리가 감당할수 있는 무게 - 현재 다리위 트럭들 무게 )와 대기배열 첫번째 값을 비교하여

    무게를 감당 할수 있다면 첫번째 트럭을 대기 배열에서 제거한다.

    동시에 시간 배열에 다리 길이의 값(방금 들어온 트럭이 남은 시간)으로 추가한다.

    다리위 트럭 배열에 해당 무게값을 추가한다.

     

    카운트 1 증가 해준다.

     

    코드 구현

     

    첫번째로 변수들을 선언해주고 반복문을 만든다.

    var trucks = truck_weights
    var trucksOnBridge = [Int]()
    var timeArray = [Int]()
    var weightOnBridge = 0
    var count = 0
    
    while !(trucks.isEmpty && trucksOnBridge.isEmpty) {
    
    }
    

    둘다 true인경우 반복문이 중단된다.

     

     

    단순하게 해야할거는 두개다.

    다리위에 넣을건지 안넣을건지

    다리위에서 빠져나올건지 안빠져나올건지.

     

    우선 다리위에서 빠져나올건지 아닌지부터 구현한다.

    if(!timeArray.isEmpty){
          timeArray = timeArray.map { $0 - 1 }
    
          if(timeArray[0] == 0 ){
              timeArray.removeFirst()
              let truckWeight = trucksOnBridge.remove(at: 0)
              weightOnBridge -= truckWeight
          }
      }
    

    시간배열은 현재 다리위에 있는 트럭들의 남은 시간의 배열이다.

    시간이 지날수록 시간 배열의 값을 -1씩 깍아주고 시간이 다지났다면 (0인경우)

    바로 시간배열과 다리위 배열에서 제거해주며 그 무게만큼 현재 무게에서 빼준다.

    이제 다리위에 넣을건지 말건지 구현한다.

            if(!trucks.isEmpty){
                if(trucks[0] <= (weight-weightOnBridge)) {
                    let truckWeight = trucks.removeFirst()
                    //다리위 무게 증가
                    weightOnBridge += truckWeight
                    //시간 배열에 다리 길이의 값으로 추가
                    timeArray.append(bridge_length)
                    //다리위 트럭 배열에 추가
                    trucksOnBridge.append(truckWeight)
                }
            }
    

    weight-weightOnBridge 의 값은 현재 다리가

    얼마만큼의 무게를 감당할수 있는지를 의미한다.

    해당 값보다 그다음 출발해야할 트럭무게가 적거나 같다면 다리위에 올라갈수 있다.

    다리위에 올라갔다면 다리위 현재 무게에 무게를 더해주고

    다리위 트럭 배열에 해당 무게를 넣어준다.

    시간배열은 다리위 트럭들의 남은시간이다. 트럭이 방금 다리위에 올라갔다면 남은시간은 다리의 길이와 같다.

    시간배열에 bridge_length 값을 마지막에 넣어주면 된다.

     

    마지막으로 카운트를 1 증가시킨다.

     

    count += 1
    

     

    전체 코드

    while !(trucks.isEmpty && trucksOnBridge.isEmpty) {
            //반복문에서 시간 배열값 -1씩 해주고 0이면 시간배열, 다리위 배열에서 제거 , 다리위 무게 감소
            if(!timeArray.isEmpty){
                timeArray = timeArray.map { $0 - 1 }
    
                if(timeArray[0] == 0 ){
                    timeArray.removeFirst()
                    let truckWeight = trucksOnBridge.remove(at: 0)
                    weightOnBridge -= truckWeight
                }
            }
           
            // 현재 가용한 무게를 비교하여 첫번째 트럭을 대기 배열에서 제거
            if(!trucks.isEmpty){
                if(trucks[0] <= (weight-weightOnBridge)) {
                    let truckWeight = trucks.removeFirst()
                    //다리위 무게 증가
                    weightOnBridge += truckWeight
                    //시간 배열에 다리 길이의 값으로 추가
                    timeArray.append(bridge_length)
                    //다리위 트럭 배열에 추가
                    trucksOnBridge.append(truckWeight)
                }
            }
            
            count += 1
    
        }
    
        
        return count
    }
    

    댓글

Designed by Tistory.