다리를 지나는 트럭

Sett·2021년 7월 15일
1

문제

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

문제 접근

  1. truck_weights에서 하나씩 뺀 다음에 처리하겠다 라는 생각은 좋았는 데,
  2. 두번째로 들어간거 트럭이 도착했는지 어쨌는지 체크를 못하겠.. (정확히는 할 수 있는데 너무 복잡해짐)
  3. 근데 마땅한 방법이 안 떠올라서 다리를 건너는 중인 배열을 튜플로 따로 만들고 진짜 다 체크할 생각을 함.
  4. (무게, 진행상황) 요소의 배열을 만들어서 ingTruck에 순차적으로 넣고
  5. 진행상황 > 다리 길이 라는 조건을 만족하면 result 배열에 넣고 모든 트럭이 빠져나오는 순간 (처음에 주어진 truck_weights의 길이하고, result 배열의 길이가 같은 때)에 while문을 멈추고 결과를 반환하도록 하였다.

결론. 개념이 어려운 건 아닌데 중간 연산 과정이 얘 나왔는지 뺐는지 진행상황이 100이 맞는 지 101이 맞는 지 이런 작은 문제들을 해결하는 게 어려웠다.

소스코드

func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
        var maxWeight = weight
        var waitingTruck = truck_weights
        var ingTruck: [(Int,Int)] = []
        var resultTruck: [Int] = []
        var result = 0
        while resultTruck.count != truck_weights.count {
            if waitingTruck.count != 0 {
                if maxWeight >= waitingTruck[0] {
                    maxWeight -= waitingTruck[0]
                    ingTruck.append((waitingTruck[0], 1))
                    waitingTruck.remove(at: 0)
                }
            }
            for i in 0..<ingTruck.count {
                ingTruck[i].1 += 1
            }
            if ingTruck.count != 0 {
                if ingTruck[0].1 > bridge_length {
                    resultTruck.append(ingTruck[0].0)
                    maxWeight += ingTruck[0].0
                    ingTruck.removeFirst()
                }
            }
            result += 1
        }
        return result + 1
    }
profile
안녕하세요

0개의 댓글

관련 채용 정보