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 부분)
반응형
'프로그래밍 > 기타' 카테고리의 다른 글
프로그래머스 - 모의고사 (C#) (2) | 2021.01.18 |
---|---|
프로그래머스 - 이중우선순위큐 (C#) (3) | 2021.01.17 |
프로그래머스 - 기능개발 (C#) (0) | 2021.01.16 |
프로그래머스 - 주식가격 (C#) (2) | 2021.01.15 |
프로그래머스 - H-Index (C#) (0) | 2021.01.15 |