기본 틀 :
using System;
public class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = new int[] {};
return answer;
}
}
처음에는 progresses와 speeds를 List에 담아서
List의 앞에서 진행률이 100인 요소를 구해
List에서 제거와 동시에 count를 증가시켜 개수를 구할 계획이었다.
이렇게, 생각한 이유는 Queue로 progresses와 speeds를 담으면
index 조회 및 값 증가가 불가능해 불편할 것이라 생각했기 때문이다.
using System;
using System.Collections.Generic;
public class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<int> result = new List<int>();
List<int> listProgresses = new List<int>(progresses);
List<int> listSpeeds = new List<int>(speeds);
while(listProgresses.Count != 0)
{
for(int i = 0; i < listProgresses.Count; i++)
{
if(listProgresses[i] >= 100) continue;
listProgresses[i] += speeds[i];
}
int count = 0;
for(int i = 0; i < listProgresses.Count; i++)
{
if(listProgresses[i] >= 100)
{
listProgresses.RemoveAt(0);
listSpeeds.RemoveAt(0);
i--;
count++;
}
else break;
}
if(count != 0) result.Add(count);
}
return result.ToArray();
}
}
그래서, 위와 같이 코드를 작성하고 평가를 받은 결과...
위와 같이 부분적인 통과만 받을 수 있었다...
이유로는,
위와 같이 progresses에서 index가 0, 1인 요소가 제거된 후
progresses의 index가 2인 요소가 index 0으로 오게 되는데 이때,
왜인지는 모르겠지만 speed가 5여야 하는데 1로 index가 0인 요소에 접근하는 문제가 있었다...
(위의 코드를 보면 listSpeeds.RemoveAt(0)로 index 0,1을 제거해준다...)
(RemoveAt(i)로 변경했는데도 같은 결과가 출력 됨)
결국 Queue를 사용하기로 마음을 먹었다...
Queue는 index 조회가 불가능하기 때문에
Dequeue로 progress와 speed를 가져와 더해준 값을
다시 Enqueue로 넣어줬다.
그리고 Peek로 가장 앞에 있는 값이 100이상이고 Count로 0이 아닐 때,
개수를 구할 수 있도록 변경해줬다.
using System;
using System.Collections.Generic;
public class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<int> result = new List<int>();
Queue<int> queueProgresses = new Queue<int>(progresses);
Queue<int> queueSpeeds = new Queue<int>(speeds);
while(queueProgresses.Count != 0)
{
for(int i = 0; i < queueProgresses.Count; i++)
{
int progress = queueProgresses.Dequeue();
int speed = queueSpeeds.Dequeue();
queueProgresses.Enqueue(progress + speed);
queueSpeeds.Enqueue(speed);
}
int count = 0;
while(queueProgresses.Count > 0 && queueProgresses.Peek() >= 100)
{
queueProgresses.Dequeue();
queueSpeeds.Dequeue();
count++;
}
if(count != 0) result.Add(count);
}
return result.ToArray();
}
}