🖊️ 문제
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
입출력 예 설명
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
🖥️ 코드
중첩 for문 사용
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> prices)
{
int size = prices.size();
vector<int> answer(size);
for (int i = 0; i < size; i++)
{
int count = 0;
for (int j = i + 1; j < size; j++)
{
count++;
if (prices[i] <= prices[j]) continue;
else break;
}
answer[i] = count;
}
return answer;
}
stack 사용
#include <string>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
vector<int> solution(vector<int> prices)
{
vector<int> answer(prices.size());
stack<int> st;
for(int time = 0; time < prices.size(); time++)
{
while(!st.empty() && prices[st.top()] > prices[time])
{
answer[st.top()] = (time-st.top());
st.pop();
}
st.push(time);
}
while(!st.empty())
{
answer[st.top()] = prices.size() - st.top() - 1;
st.pop();
}
return answer;
}
🤔 나의 생각
- 문제가 조금 헷갈렸지만 주어진 예시에서 숫자를 바꿔가며 써보니 쉽게 해결할 수 있었다.
- 참고로 문제 예시인 [1, 2, 3, 2, 3]과 [1, 2, 3, 2, 0]의 정답이 동일하다는 것만 캐치하면 문제 이해는 끝났다!
- 중첩 for로 풀어보고 stack으로도 풀어봤다. 중첩 for로 문제가 해결되는 것 보면 효율성 검사가 타이트하진 않은 듯하다.
- 중첩 for : 자기 자신보다 작은 값이 나오면 내부 for를 탈출해 정답을 갱신하는 매우 직관적인 코드다.
- stack : stack의 top이 자신보다 작거나 같을 때까지 pop 하며 정답을 갱신한다.
- stack에 대해서 한 번쯤 깊게 생각해야 할 부분이 있다. 배열에 스택을 사용해야 할 때 원소를 넣기보단 인덱스를 넣는 것이 대다수의 상황에서 깔끔하게 풀어진다. 인덱스로 값에 접근할 수 있지만 값으로 인덱스를 접근하려면 코딩이 꼬이기 시작한다.
- [프로그래머스 Level 2] 프린터 문제가 본 문제와 좀 비슷해서 생각날 때마다 풀어주면 좋을 듯하다!
'Algorithm > 프로그래머스 : Level 2' 카테고리의 다른 글
[프로그래머스 Level 2] 주차 요금 계산 (2022 카카오 기출) (0) | 2022.07.01 |
---|---|
[프로그래머스 Level 2] 신고 결과 받기 (2022 카카오 기출) (0) | 2022.07.01 |
[프로그래머스 Level 2] 영어 끝말잇기 (0) | 2021.11.22 |
[프로그래머스 Level 2] 삼각 달팽이 (0) | 2021.11.21 |
[프로그래머스 Level 2] 2개 이하로 다른 비트 (0) | 2021.11.21 |