프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제이해
입출력 예
| [ 0 ] | [ 1 ] | [ 2 ] | [ 3 ] | [ 4 ] | |
| prices | 1 | 2 | 3 | 2 | 3 |
| return | 4 | 3 | 1 | 1 | 0 |
1초의 주가는 1 이며, 1초부터 5초까지 총 4초간 주가를 유지. ( 하락하지 않음 )
2초의 주가는 2 이며, 2초부터 5초까지 총 3초간 주가를 유지. ( 하락하지 않음 )
3초의 주가는 3 이며 4초의 주가는 2로 주가가 떨어졌지만, 3초에서 4초가 되기 직전까지 1초간 유지된걸로 간주 ( 하락 )
4초의 주가는 2 이며 4초부터 5초까지 총 1초간 주가를 유지. ( 하락하지 않음 )
5초의 주가는 3 이며 5초 이후는 데이터 존재 X
문제풀이
1. 이중 for문으로 [ 0 ] 부터 출발하여 도중에 주가가 하락하는지 체크하며 진행.
2. [ 0 ] 부터 도중에 하락하는지, 또는 마지막에 도달하였는지 확인이 되면 다음 진행.
나의풀이 ( 코드 )
class Solution {
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
for (int i = 0; i < prices.length-1; i++) {
for (int j = i + 1; j < prices.length; j++) {
answer[i]++;
if (prices[i] > prices[j]) {
break;
}
}
}
return answer;
}
}
다른사람 풀이 ( 코드 )
import java.util.Stack;
class Solution {
public int[] solution(int[] prices) {
Stack<Integer> beginIdxs = new Stack<>();
int i=0;
int[] terms = new int[prices.length];
beginIdxs.push(i);
for (i=1; i<prices.length; i++) {
while (!beginIdxs.empty() && prices[i] < prices[beginIdxs.peek()]) {
int beginIdx = beginIdxs.pop();
terms[beginIdx] = i - beginIdx;
}
beginIdxs.push(i);
}
while (!beginIdxs.empty()) {
int beginIdx = beginIdxs.pop();
terms[beginIdx] = i - beginIdx - 1;
}
return terms;
}
}
for (i=1; i<prices.length; i++) {
while (!beginIdxs.empty() && prices[i] < prices[beginIdxs.peek()]) {
int beginIdx = beginIdxs.pop();
terms[beginIdx] = i - beginIdx;
}
beginIdxs.push(i);
}
- 이 구문에서는 주가가 하락하는 인덱스는 미리 처리.
- 테스트 케이스를 예시로 1 2 3 2 3 이 주어지면 3 -> 2 로 하락할때 answer [2] 인덱스에 1을 넣고 이후에 하락하지 않은 주가들을 처리하는 코드에서는 해당 ( 하락한 주가 ) 인덱스를 제외하고 처리
- 10 20 30 5 40 처럼 주어지면 해당 코드에서 10 , 20 , 30 에 해당하는 인덱스를 answer[0] = 3 , answer[1] = 2 , answer[2] = 1 로 처리.
prices[i] < prices[beginIdxs.peek()]
이 부분에서 조건에 걸린다.
int beginIdx = beginIdxs.pop();
이 부분에서 하락하는 주가들의 인덱스를 스택에서 pop() 하여 나중에는 해당 인덱스들을 제외하고 계산.
while (!beginIdxs.empty()) {
int beginIdx = beginIdxs.pop();
terms[beginIdx] = i - beginIdx - 1;
}
마지막 while문에서 하락하지 않은 주가들은 현재 마지막 index - 해당 index 로 계산. ( 하락한 주가들은 이 전 코드에서 제외 됨 )
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JAVA 자바] 뒤에 있는 큰 수 찾기 (0) | 2023.11.20 |
|---|---|
| [프로그래머스/JAVA 자바] 스킬트리 (1) | 2023.11.18 |
| [프로그래머스/JAVA 자바] 방문 길이 (0) | 2023.11.17 |
| [프로그래머스/JAVA 자바] 땅따먹기 (0) | 2023.11.12 |
| [프로그래머스/JAVA 자바] 모음 사전 (0) | 2023.09.25 |