[프로그래머스] 주식가격
2024. 8. 15. 10:47ㆍProblem Solving/Online Judge
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💬 문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 각각의 시점으로부터 가격이 떨어지지 않은 기간은 몇 초인지를 계산한다.
📌 주의 사항
- prices의 길이는 2 이상 100,000 이하
- 모든 경우의 수를 확인하는 경우 O(N^2)으로 최악의 경우 약 100억 번의 연산을 하게 되므로 시간 초과 가능성 존재
👌 문제 풀이
방법 1) 이중 for문으로 가격이 떨어질 때까지 count
방법 2) 스택 이용해서 가격이 떨어지는 지점을 pop 하고 가격이 끝까지 떨어지지 않는 시점만 스택에 남도록 함
💡 스택을 사용한 방법
- answer 배열을 각 시점(인덱스)에 따른 최대 값(해당 시점에서 끝까지 가격이 떨어지지 않는 경우)으로 초기화
- prices 배열을 돌면서 각 시점 별로 확인: i = 0 ~ prices.length
- Stack의 peek 값(이전 시점)의 가격과 현재 기준 시점의 가격을 비교
- peek(이전 시점) > i(현재 시점): 가격이 떨어졌음
- `answer[peek] = i - peek` ➡️ 가격이 떨어진 기간을 계산해서 업데이트
- `Stack에서 pop()` ➡️ peek 값 시점으로부터 가격이 떨어진 시기가 있으므로 Stack에서 pop
- Stack에 i 저장
- prices 배열을 다 돌면 Stack에는 가격이 끝까지 감소하지 않는 시점들만 남게 될 것
💻 코드
// 풀이 1
import java.util.Stack;
class Solution {
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
// 기준 시점
for (int i = 0; i < prices.length; i++) {
// 이후 시점
for (int j = i + 1; j < prices.length; j++) {
answer[i]++;
// 가격이 떨어졌다면
if (prices[i] > prices[j]) {
break;
}
}
}
return answer;
}
}
// 풀이 2
import java.util.Stack;
class Solution {
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < prices.length; i++) {
answer[i] = prices.length - 1 - i; // 최대 값으로 초기화
// Stack에 저장된 이전 시점의 가격들과 비교
while (!stack.isEmpty() && prices[stack.peek()] > prices[i]) {
// 이전 시점에 현재 시점보다 높은 가격이 있는 경우
int prev = stack.pop();
// 이전 시점의 answer 값 업데이트
answer[prev] = i - prev;
}
stack.push(i);
}
return answer;
}
}
📈 결과
'Problem Solving > Online Judge' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 (0) | 2024.08.29 |
---|---|
[프로그래머스] 베스트 앨범 (1) | 2024.08.21 |
[프로그래머스] 실패율 (0) | 2024.08.09 |
[BOJ] #1759 - 암호 만들기 (0) | 2021.06.29 |
[BOJ] #1987 - 알파벳 (0) | 2021.06.29 |