티스토리 뷰

💻JAVA 코드 바로보기



문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

 

 

제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

 

 

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

 

 


🌼 JAVA 알고리즘

 

 

□초기화면

 

 

 

 

 

□풀이과정

각 초(시간)별 stack을 구성하여 기준값보다 작은 값이 나올 경우(주가가 떨어졌을 경우) answer[j]방을 ++하는 방법을 사용했다.
import java.util.Stack;
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Stack<Integer> stack = new Stack<>();
        
        //각 방을 순환, i번째 방 이후에 [i]값보다 작은 값이 있으면 answer[i]++;
        for(int j=0;j<prices.length;j++){
            //값 대입
            for(int i=0;i<prices.length;i++){
                stack.push(prices[i]);
            }
            int temp = prices[j];
            for(int i=j;i<prices.length;i++){
                if(stack.pop()<temp) answer[j]++;
            } 
            stack.clear();
        }

        
        
        return answer;
    }
}

값이 이상해서 문제를 다시보니

가격이 떨어지지 않은 기간은 몇 초인지

를 요구하고 있다. 위의 코드는 가격이 떨어진 기간은 몇초인지 구하고 있다.
따라서 if문의 비교구문만 수정하였다.
import java.util.Stack;
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Stack<Integer> stack = new Stack<>();
        
        //각 방을 순환, i번째 방 이후에 [i]값보다 작은 값이 있으면 answer[i]++;
        for(int j=0;j<prices.length;j++){
            //값 대입
            for(int i=0;i<prices.length;i++){
                stack.push(prices[i]);
            }
            int temp = prices[j];
            for(int i=j;i<prices.length;i++){
                if(stack.pop()>=temp) answer[j]++;
            } 
            stack.clear();
        }

        
        
        return answer;
    }
}

테스트 결과를 보면 각 방의 모든 값이 1만큼 큰 것을 확인할 수 있다.
지금 코드의 for문을 보면 각 기준값을 포함하여 반복하고 있기 때문에 자기 자신 또한 >=에 통과되어 answer[j]가 ++된 것이다. 
따라서 for문의 초기값을 j가 아닌 j+1로 수정했다.
import java.util.Stack;
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        Stack<Integer> stack = new Stack<>();
        
        //각 방을 순환, i번째 방 이후에 [i]값보다 작은 값이 있으면 answer[i]++;
        for(int j=0;j<prices.length;j++){
            //값 대입
            for(int i=0;i<prices.length;i++){
                stack.push(prices[i]);
            }
            int temp = prices[j];
            for(int i=j+1;i<prices.length;i++){
                if(stack.pop()>=temp) answer[j]++;
            } 
            stack.clear();
        }

        
        
        return answer;
    }
}

하지만 다른 테스트케이스를 추가했을 때 문제에서 원하는 결과가 나오지 않았다.
위의 코드는 stack구조를 사용하여 뒤쪽의 값부터 비교하고 있고
stack구조와 같은 별도의 저장공간을 사용하지 않더라도 충분히 코드실행이 가능하기 때문에 stack을 삭제해보았다.
import java.util.Stack;
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        
        //각 방을 순환, i번째 방 이후에 [i]값보다 작은 값이 있으면 answer[i]++;
        for(int j=0;j<prices.length;j++){
            for(int i=j+1;i<prices.length;i++){
                answer[j]++;
                if(prices[i]<prices[j]) {
                    break;
                }
            } 
        }
        
        return answer;
    }
}
이중for문만을 사용했을 때에는 answer[j]++을 기본으로 실행하고, 주가가 작은 값이 나왔을 경우 break하는 방식으로 조금 수정해주었다.

문제유형이 스택이었기 때문에 Stack을 사용한 알고리즘을 짜보고 싶었지만, 다른분이 스택방식으로 해결한 코드를 보니 내가 위에서 도전했던 방법은 stack을 제대로 활용하지 못한 코드라는 것을 알았다. 더 공부가 필요할듯!
stack활용한 코드는 아래 링크로 보면 좋을 것 같다.

 

 

프로그래머스_스택/큐_주식가격 (JAVA)

문제 설명 초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은

codevang.tistory.com

 

 

 

 

 

□완성코드

class Solution {
    public int[] solution(int[] prices) {
        int[] answer = new int[prices.length];
        
        for(int j=0;j<prices.length;j++){
            for(int i=j+1;i<prices.length;i++){
                answer[j]++;
                if(prices[i]<prices[j]) {
                    break;
                }
            } 
        }
        
        return answer;
    }
}

 

 

 

 

 

 

 

 


링크

 

About Me

💻GitHub/KimSky904 KimSky904 - Overview Department of New Media Software. KimSky904 has 8 repositories available. Follow their code on GitHub. github.com

code-review.tistory.com

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

 

댓글