Coding Test/Programmers

[Lv.2] 프로세스 [프로그래머스_코딩테스트] [큐, 시뮬레이션] [25분]

whawoo 2025. 7. 10. 00:16
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

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

programmers.co.kr

운영제제의 동작에서 프로세스들이 주어지고 해당 프로세스의 우선순위 배열 Priorities가 주어질 때 location에 해당하는 프로세스가 몇번째로 시행되는지 반환시키는 문제. (큐에 프로세스들을 다 집어넣고 순차적으로 돌리되 우선순위가 더 높은 프로세스가 큐 안에 있다면 꺼냈던 프로세스를 다시 집어넣고 그렇지 않으면 실행)

🧠 나의 접근 방식과 시행착오

15분 걸린 문제. 생각해보니 Data 구조체에서 Name은 쓰이지 않았다. IsTarget을 만들면서 지웠어야 하는 부분인데 남아있던듯함. 간단하게 생각해서 일단 zero-base로 동작하는 location의 데이터인지 Data 구조체에 Priority와 같이 매칭시켜서 캐시해두고, 해당 데이터들을 Queue에 집어 넣는다. 그리고 큐를 Dequeue시키면서 해당 큐 안에 더 큰 Priority가 있으면 다시 Enqueue시키는 과정을 반복하면 된다.

using System.Collections.Generic;

public class Solution
{
    public struct Data
    {
        public int Priority;

        public int Name;
        public bool IsTarget;

        public Data(int name, int priority, bool isTarget)
        {
            Name = name;
            Priority = priority;
            IsTarget = isTarget;
        }
    }
    
    /// <summary>
    /// 프로세스
    /// https://school.programmers.co.kr/learn/courses/30/lessons/42587
    /// </summary>
    public int solution(int[] priorities, int location)
    {
        // location은 zero-base
        Queue<Data> dataQueue = new Queue<Data>();

        for (int i = 0; i < priorities.Length; i++)
        {
            dataQueue.Enqueue(new Data(i, priorities[i], i == location));
        }

        int count = 0;

        while (dataQueue.Count > 0)
        {
            var isExecute = true;
            Data data = dataQueue.Dequeue();

            // 더 우선순위 높은 데이터가 있어서 뒤로 다시 넣기
            foreach (var tData in dataQueue)
            {
                if (data.Priority < tData.Priority)
                {
                    isExecute = false;
                    break;
                }
            }

            if (!isExecute)
            {
                dataQueue.Enqueue(data);
                continue;
            }

            count++;

            if (data.IsTarget)
            {
                break;
            }
        }
        
        return count;
    }
}

✅ 풀이 코드

Linq를 쓴 좀 더 간단한 방식의 코드가 있다. Linq가 성능에 별로 좋지 않다는 점이 있어서 그렇게 활용하고 있지는 않음. 추가로 Name을 정리하는 것은 위에서 이야기한 부분이지만 나중의 디버깅을 위해서 냅둬도 큰 상관 없을 듯 함.

if (dataQueue.Any(x => x.Priority > data.Priority))

🔄 정리

우선순위 큐라는 것이 C# 7.0+에 나왔기 때문에 해당 자료구조를 사용하면 더 깔끔한 방식이 될 듯 하긴 하다. 그렇기 전에 큐 사용에 대해서 간단히 공부해볼 수 있는 문제가 될 듯 하다.

반응형