스택/큐가 주제인 문제라서 큐를 활용하여 풀이했습니다.
연산 마지막에 ArrayList에 데이터를 입력하는 이유는 반복문에 끝에
count가 1인 상태로 종료가 되기때문에 마지막 데이터를 입력하기 위해서 추가했습니다.
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new LinkedList<Integer>();
List<Integer> an = new ArrayList<Integer>();
for (int i = 0; i < progresses.length; i++) {
int data = ((100 - progresses[i]) / speeds[i]);
data += ((100 - progresses[i]) % speeds[i] > 0) ? 1 : 0;
queue.add(data);
}
// 삭제 하고 리턴
int index = queue.poll();
int count = 1;
while (!queue.isEmpty()) {
int next = queue.poll();
if (index >= next) {
count++;
} else {
an.add(count);
count = 1; // 카운트 초기화
index = next; // 기준점 변경
}
}
an.add(count);
int[] answer = new int[an.size()]; // ArrayList size 크기만큼 생성
for (int i = 0; i < an.size(); i++) {
answer[i] = an.get(i);
}
return answer;
}
큐 자료구조를 효율적으로 사용한 다른분의 풀이를 빌렸습니다.
큐에 데이터입력(offer)을 전제로 다음에오는 비교값(date)가 queue의 첫 번째 값보다 크면
결과를 반환할 ArrayList에 데이터를 입력하고 큐를 초기화한다.
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;
}
}
'알고리즘' 카테고리의 다른 글
[알고리즘] 다양한 정렬 알고리즘 (0) | 2022.04.28 |
---|---|
[알고리즘] 숫자를 뒤집기 (0) | 2022.04.06 |
[프로그래머스] 모의고사 (0) | 2022.03.04 |
[프로그래머스] 주식가격 (0) | 2022.02.01 |
[프로그래머스] 프린트 (0) | 2022.01.23 |
댓글