[문제설명]
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
[제한 사항]
[입출력 예]
prices : [1, 2, 3, 2, 3]
return : [4, 3, 1, 1, 0]
[입출력 예 설명]
[나의 풀이]
package level2;
public class 주식가격{
public int[] solution(int[] prices) {
int[] answer = new int[prices.length]; //0으로 초기화
for (int i = 0; i < prices.length; i++) {
for (int j = i + 1; j < prices.length; j++) {
if (prices[j] >= prices[i])
answer[i]++;
else {
answer[i]++;
break;
}
}
}
return answer;
}
public static void main(String[] args) {
주식가격 answer = new 주식가격();
int[] prices = {1,2,3,2,3};
int[] result = answer.solution(prices);
for (int e : result)
System.out.println("e = " + e);
}
}
스택/큐 문제이지만, 당장 스택/큐를 사용한 풀이법 보다 다른 풀이법이 생각나서 위와 같이 풀이해 보았다. 2중 반복문으로 풀이하였다.
로직은 아래와 같다.
- 입력으로 들어온 배열의 길이와 같은 길이의 0으로 초기화된 배열을 생성해준다.
- for 반복문을 돌면서, 숫자를 하나 선택한다.
- for 반복문안에 다른 for 반복문을 통하여, 선택한 숫자 다음의 숫자들과 선택한 숫자를 비교해준다.
- 만약 선택한 숫자가 다음의 숫자들보다 작거나 같으면, 해당 주식가격은, 1초동안 떨어지지 않은것이므로 1에서 생성해준 배열의 선택한 숫자의 인덱스에 값을 계속 더해준다.
- 만약 가격이 떨어진 경우, 1초동안은 가격이 유지되었다고 여기므로, 생성해준 배열의 선택한 숫자의 인덱스에 값을 더해준 뒤, 반복문을 탈출한다.
처음에는 답이 계속 틀리길래, 로직에 문제가 있나 생각했지만,
입출력 예 설명에서 "1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다." 해당 문구를 놓치고 문제를 풀고 있었다.
현재는 prices 배열의 길이가 100000이하이므로, 위의 로직이 통과가 되었지만, 배열의 길이가 더 길어지면, 아마 스택/큐 자료구조를 이용하여 풀이를 해야 통과가 될 수도 있을 것이다.
해당 문제는 추후에 스택/큐 자료구조를 이용하여 풀이해볼 예정이다.
아래는 채점결과이다.