본문 바로가기
개발/문제풀이

문제풀이) 프로그래머스)C#) 다리를 지나는 트럭

by 테샤르 2020. 8. 21.

다리를 지나는 트럭

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

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이��

programmers.co.kr

이 코드는 다른 풀이 방식을 참고한 코드로 실제 내가 풀었던 코드는 실패가 난 상황이다.

그런데. 케이스를 찾지를 못한 상황이 생겨서 검색하게 된 코드이다.

 

public int solution(int bridge_length, int weight, int[] truck_weights)
    {
        Queue<int> bridge = new Queue<int>(new int[bridge_length]);
        Queue<int> trucks = new Queue<int>(truck_weights);

        int time = 0; int arrivalCount = 0;
        int truckNum = truck_weights.Length;
        int totalWeight = 0;
        while (arrivalCount != truckNum)
        {
            time++; 
            var arrival = bridge.Dequeue();
            if (arrival > 0)

            { totalWeight -= arrival; arrivalCount++; }
            if (trucks.Count == 0)
                bridge.Enqueue(0);
            else if (totalWeight + trucks.Peek() > weight)
                bridge.Enqueue(0);
            else
            {
                int newTruck = trucks.Dequeue();
                bridge.Enqueue(newTruck);
                totalWeight += newTruck;
            }
        }

        return time;
       }

본인이 짠 코드는 다음과 같다. 그러나 실패  정확도에서 3가지 케이스를 통과하지 못했으나 케이스를 발견하지 못했다.

class BridgeInfo
{
    public int weight;
    public int end;
}


public int solution(int bridge_length, int weight, int[] truck_weights)
    {
    int answer = 0;

        int currentWieght = weight;
        Queue<BridgeInfo> QueueData = new Queue<BridgeInfo>();
        
        answer++;
        for(int i = 0; i< truck_weights.Length; i++){

            int value = truck_weights[i];
            while(currentWieght < value){
                BridgeInfo calcInfo = QueueData.Dequeue();
                currentWieght += calcInfo.weight;
                answer = calcInfo.end;
            };
        
            BridgeInfo info = new BridgeInfo();
            info.weight = value;
            info.end = (answer + bridge_length);
            QueueData.Enqueue(info);
            currentWieght -=value;
            answer++;
            
        }
        
        BridgeInfo endInfo = QueueData.Last();
        answer = endInfo.end;
        
        return answer;
    }

조금 더 고민을 해봐야 할 듯하다.  프로그래머스는 테스트 케이스가 조금 명확하지 않아서 좀 아쉽다. 실패된 케이스나 여러 가지를 고려할 수 있는 상황을 알려주면 좋을 텐데.. 아쉽..

그래도 꾸준히 풀어야겠다.

 

 ★

 

반응형

댓글