출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42586
import java.util.ArrayList;
import java.util.Stack;
// 예시
int[] progresses = {95, 90, 99, 99, 80, 99};
int[] speeds = {1, 1, 1, 1, 1, 1};
// int[] progresses = {90, 30, 55};
// int[] speeds = {1, 30, 5};
// int[] progresses = {20, 99, 93, 30, 55, 10};
// int[] speeds = {5, 10, 1, 1, 30, 5};
class Solution {
public ArrayList<Integer> solution(int[] progresses, int[] speeds) {
Stack<Integer> workDays = new Stack<>();
ArrayList<Integer> answer = new ArrayList<>();
// stack에 남은 작업 기간 담아주기
for (int i = progresses.length - 1; i >= 0; i--) {
int p = progresses[i];
int workday = 0;
while (p < 100) {
p = p + speeds[i];
workday++;
}
workDays.push(workday);
}
// 배포 가능 기능 수 세어주기
int cnt = 1;
int maxDay = workDays.peek();
while (!workDays.isEmpty()) {
int workday = workDays.pop();
if (!workDays.isEmpty()) {
if (workday >= workDays.peek() || maxDay>workDays.peek()) {
cnt++;
} else {
answer.add(cnt);
cnt = 1;
maxDay = workDays.peek();
}
} else {
answer.add(cnt);
}
}
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> q = new LinkedList<>();
List<Integer> answerList = new ArrayList<>();
for (int i = 0; i < speeds.length; i++) {
double remain = (100 - progresses[i]) / (double) speeds[i];
int date = (int) Math.ceil(remain);
if (!q.isEmpty() && q.peek() < date) { // 근데 여기도 조금 수정해야 할 것 같다.
answerList.add(q.size());
q.clear();
}
q.offer(date);
}
answerList.add(q.size());
int[] answer = new int[answerList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}
프로그래머스 고득점 Kit의 스택, 큐 문제이다. 근데 스택 쓰고싶어서 스택으로 써서 풀었는데 시간초과로 틀렸다. 그래서 다른 사람 풀이를 봤는데 거의 스택 큐를 안썻길래 그 중에 스택, 큐로 쓴 풀이를 가져왔다. 나는 남은 작업일을 스택에 넣어서 다시 빼주는 구조로 코드를 짯는데 이 분은 남은 날과 배포 기능을 세는 일을 한번에 하는 코드로 짜셨다. 훨씬 효율적인 것 같다. 근데 내가 문제이해를 못한건지 긴가민가한 부분이 있어서 리펙토링을 해봐야 될 것 같다.
아직 Lv2는 많이 어렵다.
덕분에 좋은 정보 얻어갑니다, 감사합니다.