문제 설명
해결과정
Solution.java
import java.util.*;
class Solution {
public int[] solution(int[] prices) {
// 정답이 들어갈 변수 answer
// prices의 원소의 인덱스 i, prices[i] 값 보다 작으면서 가장 가까운 원소의 인덱스 j (i < j),(prices[j] < prices[i])
// answer[i] = j - i;
int[] answer = new int[prices.length];
// 값이 떨어지는 순간을 연산하기 위한 ArrayDeque
// for문을 사용해서 prices의 원소를 방문한다.
// deque에 값이 존재하고 해당 값(tempIndex)이 가르키는 prices의 값과 현재 방문한 prices의 원소를 비교
// 현재 방문한 원소가 deque 가 가르키는 원소보다 작다면
// answer[tempIndex]의 현재 for문의 index - tempIndex 값을 저장
// deque에서 가장 최근 값 제거
// 다음 반복문 실행
// 현재 방문한 원소가 deque 가 가르키는 원소보다 크거나 같다면
// deque에 현재 for 문의 index값 추가
ArrayDeque<Integer> deque = new ArrayDeque<Integer>();
// deque.addLast(0);
// for-each문을 사용하기 위한 index
int index = 0;
// deque에서 사용하는 임시 인덱스
int tempIndex = 0;
// 향상된 for문으로 가격 확인
for(int price : prices) {
while(true) {
// deque이 비어있다면 현재 index 값 deque에 집어넣기
if(deque.isEmpty()) {
deque.addLast(index);
break;
}
// deque에 값이 있다면 현재 원소값과 deque에서 tempIndex가 가르키는 원소 비교
else {
// 가장 최근에 있던 값을 가져오기(인덱스)
tempIndex = deque.getLast();
// 현재 원소가 스택이 가르키는 원소보다 작다면
if(price < prices[tempIndex]) {
// 값이 떨어지지 않은 기간을 answer 에 저장
answer[tempIndex] = index - tempIndex;
// 최근 값 제거
deque.removeLast();
}
// 현재 원소가 스택이 가르키는 원소보다 크다면
else {
deque.addLast(index);
break;
}
}
}
index++;
}
while(!deque.isEmpty()) {
answer[deque.getLast()] = (answer.length - 1) - deque.removeLast();
}
// System.out.println(deque.toString());
return answer;
}
}
Java
복사