- 문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 풀이
import java.util.*;
class Solution {
//스택을 이용한 풀이가 생각나지 않아 구글 검색후 블로그를 참고하였습니다.
public int[] solution(int[] prices) {
//여러번 사용되는 주식가격의 크기를 담아줍니다.
int len = prices.length;
//답이되는 answer 배열의 크기가 len과 같기 때문이 미리 선언해줍니다.
int[] answer = new int[len];
//문제 풀이에 사용될 Stack을 생성해줍니다.
Stack<Integer> st = new Stack<>();
//for문을 통해 주식가격을 순서대로 꺼내며 확인합니다.
for(int i=0; i<len; i++){
//Stack이 비어있다면 다른 연산 없이
//채워주고 다음 주식가격을 확인합니다.
//Stack에는 주식가격과 주식가격의 index를 함께
//확인하기 위해 index를 Stack에 넣어주며 비교합니다.
if(st.isEmpty()){
st.add(i);
//Stack이 비어있다면 이전의 주식가격과 현재 i번째의 주식가격을 비교해봐야 합니다.
} else {
//먼저 Stack에의 가장 위에 있는 주식가격이
//i번째 주식가격보다 크거나 같다면 Stack에 그대로 주식가격을 추가해줍니다.
if(prices[st.peek()] <= prices[i]){
st.add(i);
//i번째 주식가격이 Stack 최상단의 주식가격보다 작다면, 주식가격이 떨어졌다고 판단할 수 있습니다.
} else {
//그럼 해당 주식가격을 꺼내주고, 해당 주식가격은
//Stack에 들어간 이후(해당 주식가격의 index)부터 i초까지 주식가격이 떨어지지 않았다고 판단할 수 있기
//때문에 해당 위치에 i-costIdx를 answer[coastIdx]에 담아줍니다.
//또 그 이전에 담아졌던 주식가격들 또한 i번째 주식가격보다 크다면 동일하게 처리해줍니다.
//마지막으로 while 연산의 반복을 통해 Stack이 비어질 수 있기
//때문에 !st.isEmpty() 조건을 while에 꼭 넣어줍니다.
while(!st.isEmpty() && prices[st.peek()] > prices[i]){
int costIdx = st.pop();
answer[costIdx] = i-costIdx;
}
//Stack의 주식가격을 확인한 후 i또한 Stack에 추가해줍니다.
st.add(i);
}
}
}
//이제 모든 주식가격을 확인했고, 끝까지 Stack에 남아있는
//주식 가격의 경우 prices가 끝날때 까지 주식가격이 떨어지지 않았다고
//판단할 수 있습니다.
//따라서 prices의 마지막 index인 (len-1) - 해당 주식가격의 index인 n 값을
//각각 answer에 추가해줍니다.
if(!st.isEmpty()){
for(int n : st){
answer[n] = (len-1)-n;
}
}
//답을 반환합니다.
return answer;
}
}
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 숫자 변환하기, java (0) | 2025.02.05 |
---|---|
[프로그래머스] 택배상자, java (0) | 2025.02.04 |
[프로그래머스] 더 맵게, java (0) | 2025.02.03 |
[프로그래머스] 모음사전, java (0) | 2025.01.31 |
[프로그래머스] 뒤에 있는 큰 수 찾기, java (0) | 2025.01.31 |