https://school.programmers.co.kr/learn/courses/30/lessons/42586
Queue 선언
Queue<Integer> queue = new LinkedList<>();
Queue 값 추가
- add
- 해당 큐 맨 뒤에 값 삽입
- 값 추가 성공 시 true 반환
- 큐 꽉 차면 IllegalStateException 에러 발생
- offer
- 해당 큐 맨 뒤에 값 삽입
- 값 추가 성공 시 true 반환
- 값 추가 실패 시 false 반환
Queue 값 제거
- remove
- 큐 맨 앞에 있는 값 반환 후 삭제
- 큐 비어있으면 NoSuchElementException 에러 발생
- poll
- 큐 맨 앞에 있는 값 반환 후 삭제
- 큐 비어있으면 null 반환
- clear
- 큐 비우기
Queue의 맨 앞 값 확인
- element
- 큐의 맨 앞에 있는 값 반환
- 큐가 비어있으면 NoSuchElementException 에러 발생
- peek
- 큐의 맨 앞에 있는 값 반환
- 비어 있을 때 null 반환
1. ArrayList를 이용한 풀이
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> day = new ArrayList<>();
ArrayList<Integer> answerList = new ArrayList<>();
for(int i=0;i<progresses.length;i++) {
day.add((int)Math.ceil(((double)100-progresses[i])/(double)speeds[i]));
}
int count = 1;
int stuckDay = day.get(0);
for(int i=1; i<day.size(); i++) {
// 중요도가 높은 기능이 개발되는 시간이 뒤에 있는 기능보다 거리는 시간이 많을때 갯수 만큼 배포되는 기능++
if(stuckDay >= day.get(i)) {
count ++;
}else { // 뒤에 있는 일 수가 크면 앞에 있는 기능은 이미 배포된 상태
answerList.add(count); // 배포되는 기능 추가
count = 1; // 기능 개수 초기화
stuckDay = day.get(i); // 다시 count하기 위해 stuckDay 현재 일수를 넣기
}
}
answerList.add(count); // 마지막 일 수에 배포되는 기능 넣기
int[] answer = new int[answerList.size()];
for(int i=0;i<answer.length;i++){
answer[i] = answerList.get(i).intValue();
}
return answer;
}
}
- 먼저 각각의 기능들이 완료되는 데 걸리는 시간을 계산한 배열을 만든다.
- 속도로 남은 시간을 나누어 몇일이 걸리는지 계산한다. 1.1일이 걸렸다면 2일이 걸린 것이기 때문에 Math.ceil을 적용
- 기능은 항상 1개부터이기 때문에 count 변수 1로 초기화
- 비교하기 위해서 stuckDay안에 day의 첫 번째 인자를 넣는다.
- 몇 일째에 몇 개의 기능이 배포되는 지 구하기 위해 for문을 돌린다.
- 중요도가 높은 기능이 개발되는 시간이 뒤에 있는 기능보다 걸리는 시간이 많을 때, 개수 만큼 배포되는 기능 ++ (count ++)
- 그게 아닐 때는 answerList에 기능들을 다 추가
- 다시 처음부터 기능 배포해야 하기 위해 기능 개수 초기화
- 다시 기능을 count 하기 위해 stuckDay에 현재 일수를 넣기
- 마지막으로 배포되는 기능을 answerList에 추가
2. 똑같은 로직을 Queue를 이용한 풀이
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new LinkedList<>();
List<Integer> answerList = new ArrayList<>();
for(int i=0;i<speeds.length;i++) {
double date = (100 - progresses[i]) / (double) speeds[i];
int day = (int) Math.ceil(date);
if(!queue.isEmpty() && queue.peek() < day) {
answerList.offer(queue.size());
queue.clear();
}
queue.offer(day);
}
answerList.add(queue.size());
int[] answer = new int[answerList.size()];
int count = 0;
for(int i : answerList) {
answer[count++] = i;
}
return answer;
}
}
- 요소 뒤의 값이 클 때까지 queue에 값을 추가하고 값이 뒤 보다 커질 때 answerList에 넣고, queue.clear()!
- 향상된 for문을 사용할 때 answer[count++] = i 하게 되면 => answer[0] = i 다음에 count ++ 하는 것과 동일함!
- queue를 이용하니까 훨씬 가독성이 좋아진 것 같다.
- 오류가 안생기는 offer, poll, clear, peek을 사용해야겠다.!!!!
'algorithm > Programmers' 카테고리의 다른 글
[JAVA] K번째 수 (0) | 2023.03.31 |
---|---|
[JAVA] 올바른 괄호 (0) | 2023.03.31 |
[JAVA] 같은 숫자는 싫어 (0) | 2023.03.29 |
[JAVA] 전화번호 목록 (0) | 2023.03.29 |
[JAVA] 완주하지 못한 선수 (0) | 2023.03.28 |