Maenya's Techlog

[20210525] 프로그래머스 - 주식가격이 떨어지지 않은 초(stack, 이중for문, 버블 정렬, 다음요소와 비교) 본문

개발자의 삶/코딩 문제풀이

[20210525] 프로그래머스 - 주식가격이 떨어지지 않은 초(stack, 이중for문, 버블 정렬, 다음요소와 비교)

ming235 2021. 5. 25. 00:24

https://programmers.co.kr/learn/courses/30/lessons/42584

 

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

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

programmers.co.kr

 

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 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초간 가격이 떨어지지 않은 것으로 봅니다. (1초뒤떨어진다)
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

 

나는 이 문제를 queue를 쓰지 않고 풀어보고 싶었다. (최종은 아래)

   /**
     * 코테 풀이  실패한 코드
     * @return answer
     */
    public int[] solution(int[] prices) {

        int common = prices.length;
        int[] answer = new int[common];     // 어차피 답은 prices 개수만큼 나옴

        for (int i=0; i<common; i++) {
            int filterCnt = 0;
            for (int j=i+1; j<common; j++) {
                if (prices[j] >= prices[i]) {
                    filterCnt += 1;
                }
            }
            if (i == common-1) {
                answer[i] = 0;
            } else {
                answer[i] = filterCnt;
            }
        }
        return answer;
    }
//            IntStream stream = Arrays.stream(prices,i+1, common);   // 기준이 되는 값 이후로만 보면 된다.
//                    .filter(amount -> amount >= target);

스트림을 써서 해봣는데도 효율성 에러가 나고 애초에 실패가 뜬다.

답도 안맞나보다.

 

 

2틀차에 시도 (최종 풀이)

class Solution {
    public int[] solution(int[] prices) {

        int common = prices.length;
        int[] answer = new int[common];     // 어차피 답은 prices 개수만큼 나옴

        for (int i=0; i<common; i++) {
            int filterCnt = 0;          // 가격이 몇초간 떨어지지 않는지 센다
            for (int j=i+1; j<common; j++) {
                if (prices[j] >= prices[i]) {
                    filterCnt += 1;     // 가격이 떨어지지 않거나 높아졌다면 계속 +1
                } else if (prices[j] < prices[i]) {
                    filterCnt += 1;     // 1초'뒤'에 떨어지므로 1초를 센다
                    break;	// 가격이 떨어졌다면 for문 종료
                }
            }
            if (i == common-1) {    // 더이상 다음 가격이 없으므로 마지막 배열은 무조건 0
                answer[i] = 0;
            } else {
                answer[i] = filterCnt;
            }
        }
        return answer;
    }
}

주의!

1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다. 

이 부분을 이해했다면 else if 문을 위와 같이 추가할 수 있다.

 

비로소 통과