본문 바로가기

프로그래밍/기타

프로그래머스 - 디스크 컨트롤러 (C#)

728x90
반응형
using System;
using System.Collections.Generic;
using System.Numerics;

public class Job
{
    public int requestTime;
    public int taskTime;

    public Job(int requestTime, int taskTime)
    {
        this.requestTime = requestTime;
        this.taskTime = taskTime;
    }
}

public class Solution 
{
    public int solution(int[,] jobs)
    {
        List<Job> jobList = new List<Job>();
        for (int i = 0; i < jobs.GetLength(0); ++i)
        {
            Job job = new Job(jobs[i, 0], jobs[i, 1]);
            jobList.Add(job);
        }

        jobList.Sort((a, b) =>
        {
            int requestTime = a.requestTime - b.requestTime;
            if (requestTime == 0)
                return a.taskTime - b.taskTime;
            return requestTime;
        });

        int loopCount = 0;
        int endTaskTime = 0;
        double sum = 0;
        while (jobList.Count > 0)
        {
            Job waitingJob = null;
            for (int i = 0; i < jobList.Count; ++i)
            {
                if (jobList[i].requestTime > endTaskTime)
                    break;

                if (waitingJob == null)
                {
                    waitingJob = jobList[i];
                }
                else
                {
                    int priotyTime = waitingJob.taskTime - jobList[i].taskTime;
                    if (priotyTime == 0)
                        priotyTime = waitingJob.requestTime - jobList[i].requestTime;
                    waitingJob = priotyTime <= 0 ? waitingJob : jobList[i];
                }
            }

            if (waitingJob == null)
                waitingJob = jobList[0];

            int delay = endTaskTime - waitingJob.requestTime;
            int ms = Math.Max(delay, 0) + waitingJob.taskTime;
            endTaskTime += delay < 0 ? Math.Abs(delay) + waitingJob.taskTime : waitingJob.taskTime;
            sum += ms;
            jobList.Remove(waitingJob);
            loopCount++;
        }

        return (int)(sum / jobs.GetLength(0));
    }
}

원래는 우선순위 큐를 구현해야하는거라 waitingJob에 Add하고 Sort하여 새로운 원소가 들어올때마다

우선순위에 따른 정렬을 해줘야하지만 비효율적인거 같아서 수정했다.

 

이번 문제는 우선순위의 조건이 무엇인지만 알면 간단하다.

(우선 순위의 조건을 몰라서 헤맸다.)

 

우선 순위 조건

1. 요청시간(RequestTime)이 짧은 순서대로 정렬한다.

( 28 Line JobList.Sort부분)

 

2. 작업시간(TaskTime)이 가장 짧은 작업을 찾는다.

(42 Line For문 부분)

 

2 - 1. 이 때, 이전에 작업이 끝난 시간(endTaskTime) 보다 요청시간이 늦지 않은 작업들 중에서 찾아야 한다.

(44 Line의 if (jobList[i].requestTime > endTaskTime) break 부분)

 

 

다람쥐와 포동포동이

 

 

 

RememberCook 9월 28일 정식 출시!

두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관

chipmunk-plump-plump.tistory.com

반응형