백준 등 알고리즘

[C#] 프로그래머스 Lv.2 프로세스 (Queue 튜플)

박도치 2024. 11. 22. 20:59

https://school.programmers.co.kr/learn/courses/30/lessons/42587?language=csharp

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

요약하자면 프로세스에서 대기중인 큐를 꺼내서 우선순위가 높으면 꺼내고, 아니라면 다시 queue에 집어넣어서 우선순위가 높은 queue부터 하나씩 빼는 문제이다.

 

주어진 location이 검사하고 싶은 숫자의 위치이고, 해당 숫자가 몇번째로 추출이 되는데 return하는 문제이다.

 

Queue 튜플

queue 튜플은 여러 데이터를 하나의 그룹으로 묶어주는 데이터 타입이다. queue가 아니더라도 그냥 여러 데이터를 그룹으로 묶어서 반환하거나 관리할 수 있다.

 

var tuple = (1, "pi", 3.14);
Console.WriteLine(myTuple.Item1); 
Console.WriteLine(myTuple.Item2); 
Console.WriteLine(myTuple.Item3);

 

Default로 지정되어있는 이름은 Item1, Item2 ... 이런 식이지만, 변수명처럼 정해줄 수 있다.

 

 public int solution(int[] priorities, int location)
 {
     Queue<(int priority, int index)> queue = new Queue<(int, int)>();

     for(int i = 0; i < priorities.Length; i++)
     {
         queue.Enqueue((priorities[i], i));
     }
 }

 

이렇게 받아온 배열을 반복문을 통해 배열의 숫자와 index를 각각 priority, index라는 변수명으로 관리해줄 수 있다.

 

Queue.Any()

이는 Linq 함수로 특정 조건을 만족하면 true 아니면 false를 return해주는 함수이다.

 

queue.Any()로 매개변수를 없는 상태로 사용하면, 큐가 비었는지 아닌지에 대해 return 해준다. (비었으면 false, 차있으면 true)

 

매개변수를 넣는다면 비교하여 true flase를 해줄 수 있다. 

 

예를들어 이전수를 dequeue하여 수를 저장하고, 현재 수와 비교하여 현재 수가 크면 다시 enqueue, 아니면 그대로 꺼내고 수를 증가시키면 된다.

 

public class Solution
{
    public int MaxCount = 0;

    public int solution(int[] priorities, int location)
    {
        Queue<(int priority, int index)> queue = new Queue<(int, int)>();

        for(int i = 0; i < priorities.Length; i++)
        {
            queue.Enqueue((priorities[i], i));
        }

        int num = 0;

        while(queue.Count > 0)
        {
            var currentNum = queue.Dequeue();

            if (queue.Count > 0 && queue.Any(p => p.priority > currentNum.priority))
            {
                queue.Enqueue(currentNum);
            }
            else
            {
                num++;
                if(currentNum.index == location)
                {
                    return num;
                }
            }

        }

        return -1;
    }
}