first-try
오로지 idx를 활용해서 빡구현으로 가볍게 문제 풀었음.
import java.util.*;
class Solution {
List<Integer> answerList = new ArrayList<>();
public int[] solution(int[] progresses, int[] speeds) {
int idx = 0;
while(idx < progresses.length){
if(progresses[idx] >= 100){
int deployment = 0;
for(int i = idx; i < progresses.length; i++){
if(progresses[i] < 100)
break;
deployment++;
idx++;
}
answerList.add(deployment);
continue;
}
for(int i = idx ; i < progresses.length; i++){
progresses[i] += speeds[i];
}
}
return getAnswer();
}
private int[] getAnswer(){
int[] answer = new int[answerList.size()];
for(int i = 0 ; i < answer.length; i++){
answer[i] = answerList.get(i);
}
return answer;
}
}인덱스만을 통해서 문제를 풀면 시간복잡도 및 공간복잡도에서 더 효율적일진 몰라도, 신뢰성이 비교적 떨어짐.
코테에서 긴장하다보면 안풀려서 멘탈 흔들릴 수 있으므로 Queue를 이용해서도 풀어볼 필요성을 느낌.
second-try
import java.util.*;
class Solution {
List<Integer> answerList = new ArrayList<>();
Queue<Integer> progressQueue = new LinkedList<>();
Queue<Integer> speedQueue = new LinkedList<>();
public int[] solution(int[] progresses, int[] speeds) {
init(progresses, speeds);
while(!progressQueue.isEmpty()){
if(progressQueue.peek() >= 100){
int count = 0;
int size = progressQueue.size();
for(int i = 0 ; i < size; i++){
if(progressQueue.peek() < 100)
break;
progressQueue.poll();
speedQueue.poll();
count++;
}
System.out.println();
answerList.add(count);
continue;
}
work();
}
return getAnswer();
}
private void init(int[] progresses, int[] speeds){
for(int progress : progresses){
progressQueue.add(progress);
}
for(int speed : speeds){
speedQueue.add(speed);
}
}
private int[] getAnswer(){
int[] answer = new int[answerList.size()];
for(int i = 0 ; i < answer.length; i++){
answer[i] = answerList.get(i);
}
return answer;
}
private void work(){
for(int i = 0 ; i < progressQueue.size(); i++){
int num = progressQueue.poll();
int speed = speedQueue.poll();
progressQueue.add(num + speed);
speedQueue.add(speed);
}
}
}
refactoring version!
import java.util.*;
class Solution {
List<Integer> answerList = new ArrayList<>();
Queue<Integer> progressQueue = new LinkedList<>();
Queue<Integer> speedQueue = new LinkedList<>();
public int[] solution(int[] progresses, int[] speeds) {
init(progresses, speeds);
while(!progressQueue.isEmpty()){
if(progressQueue.peek() >= 100){
int deployment = 0;
int size = progressQueue.size();
for(int i = 0 ; i < size; i++){
if(progressQueue.peek() < 100)
break;
poll();
deployment++;
}
answerList.add(deployment);
continue;
}
workOneDay();
}
return getAnswer();
}
private void init(int[] progresses, int[] speeds){
for(int progress : progresses){
progressQueue.add(progress);
}
for(int speed : speeds){
speedQueue.add(speed);
}
}
private int[] getAnswer(){
int[] answer = new int[answerList.size()];
for(int i = 0 ; i < answer.length; i++){
answer[i] = answerList.get(i);
}
return answer;
}
private void workOneDay(){
for(int i = 0 ; i < progressQueue.size(); i++){
int num = progressQueue.poll();
int speed = speedQueue.poll();
progressQueue.add(num + speed);
speedQueue.add(speed);
}
}
private void poll(){
progressQueue.poll();
speedQueue.poll();
}
}

