본문 바로가기

프로그래밍/기타

프로그래머스 - 다리를 지나는 트럭 (C#)

728x90
반응형

 

// =================================================
// =============== LinkedList로 구현 ===============
// =================================================

using System.Collections.Generic;

public class Solution
{
    public int solution(int bridge_length, int weight, int[] truck_weights)
    {
        LinkedList<Truck> waitTrucks = new LinkedList<Truck>();
        LinkedList<Truck> bridgeTrucks = new LinkedList<Truck>();
        for (int i = 0; i < truck_weights.Length; ++i)
        {
            Truck truck = new Truck(truck_weights[i]);
            waitTrucks.AddLast(truck);
        }

        int speed = 0;
        int bridgeWeight = 0;
        while (waitTrucks.Count > 0 || bridgeTrucks.Count > 0)
        {
            speed++;

            if (bridgeTrucks.Count > 0)
            {
                foreach (Truck moveTruck in bridgeTrucks)
                {
                    moveTruck.TruckMove();
                }

                Truck firstTruck = bridgeTrucks.First.Value;
                if (firstTruck.IsComplete(bridge_length))
                {
                    bridgeWeight -= firstTruck.Weight;
                    bridgeTrucks.RemoveFirst();
                }
            }

            if (waitTrucks.Count > 0)
            {
                Truck firstTruck = waitTrucks.First.Value;
                int totalWeight = firstTruck.Weight + bridgeWeight;
                if (totalWeight <= weight)
                {
                    bridgeWeight = totalWeight;
                    bridgeTrucks.AddLast(firstTruck);
                    waitTrucks.RemoveFirst();
                }
            }
        }

        return speed;
    }
}

public class Truck
{
    public int Weight { get; private set; }
    private int move;

    public Truck(int weight)
    {
        Weight = weight;
        move = 0;
    }

    public void TruckMove()
    {
        move++;
    }

    public bool IsComplete(int goal)
    {
        return move == goal;
    }
}

 

// =================================================
// ================= Queue로 구현 ==================
// =================================================

using System.Collections.Generic;

public class Solution
{
    public int solution(int bridge_length, int weight, int[] truck_weights)
    {
        Queue<Truck> waitTrucks = new Queue<Truck>();
        Queue<Truck> bridgeTrucks = new Queue<Truck>();
        for (int i = 0; i < truck_weights.Length; ++i)
        {
            Truck truck = new Truck(truck_weights[i]);
            waitTrucks.Enqueue(truck);
        }

        int speed = 0;
        int bridgeWeight = 0;
        while (waitTrucks.Count > 0 || bridgeTrucks.Count > 0)
        {
            speed++;

            if (bridgeTrucks.Count > 0)
            {
                foreach (Truck moveTruck in bridgeTrucks)
                {
                    moveTruck.MoveTruck();
                }

                Truck firstTruct = bridgeTrucks.Peek();
                if (firstTruct.IsComplete(bridge_length))
                    bridgeWeight -= bridgeTrucks.Dequeue().Weight;
            }

            if (waitTrucks.Count > 0)
            {
                Truck truck = waitTrucks.Peek();
                int totalWeight = truck.Weight + bridgeWeight;
                if (totalWeight <= weight)
                {
                    bridgeWeight = totalWeight;
                    bridgeTrucks.Enqueue(truck);
                }
            }
        }

        return speed;
    }
}

public class Truck
{
    public int Weight { get; private set; }
    private int move;

    public Truck(int weight)
    {
        Weight = weight;
        move = 0;
    }

    public void MoveTruck()
    {
        move++;
    }

    public bool IsComplete(int goal)
    {
        return move == goal;
    }
}

 

// =================================================
// ================== List로 구현 ==================
// =================================================

using System.Collections.Generic;

public class Solution
{
    public int solution(int bridge_length, int weight, int[] truck_weights)
    {
        List<Truck> waitTrucks = new List<Truck>();
        List<Truck> bridgeTrucks = new List<Truck>();
        for (int i = 0; i < truck_weights.Length; ++i)
        {
            Truck truck = new Truck(truck_weights[i]);
            waitTrucks.Add(truck);
        }

        int speed = 0;
        int bridgeWeight = 0;
        while (waitTrucks.Count > 0 || bridgeTrucks.Count > 0)
        {
            speed++;

            for (int i = (bridgeTrucks.Count - 1); i >= 0; --i)
                bridgeTrucks[i].TruckMove();

            if (bridgeTrucks.Count > 0 && bridgeTrucks[0].IsComplete(bridge_length))
            {
                bridgeWeight -= bridgeTrucks[0].Weight;
                bridgeTrucks.RemoveAt(0);
            }

            if (waitTrucks.Count > 0)
            {
                int totalWeight = waitTrucks[0].Weight + bridgeWeight;
                if (totalWeight <= weight)
                {
                    bridgeWeight = totalWeight;
                    bridgeTrucks.Add(waitTrucks[0]);
                    waitTrucks.RemoveAt(0);
                }
            }
        }

        return speed;
    }
}

public class Truck
{
    public int Weight { get; private set; }
    private int move;

    public Truck(int weight)
    {
        Weight = weight;
        move = 0;
    }

    public void TruckMove()
    {
        move++;
    }

    public bool IsComplete(int goal)
    {
        return move == goal;
    }
}

 

코드는 다 비슷한데 List로 구현한게 속도가 가장 빠르다.

 

 

반응형

'프로그래밍 > 기타' 카테고리의 다른 글

프로그래머스 - 위장 (C#)  (0) 2021.01.14
구글 스토어 앱 등록  (10) 2020.10.03
프로그래머스 - 프린터 (C#)  (0) 2020.09.19
Tearing (티어링)  (2) 2020.05.02
IO 게임  (0) 2020.04.14