[JAVA/프로그래머스] 스택/큐_주식가격

👀 문제

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

👊 첫 번째 도전

1. 설계

  1. 이중 for문을 사용하여 i를 기준으로 두고, j로 뒷 원소들과 비교한다.
  2. i보다 같거나 큰 원소들의 갯수를 세서 answer에 저장한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = {};
        int cnt=0;
        answer=new int[prices.length];
        for(int i=0;i<prices.length-1;i++){
            for(int j=i+1;j<prices.length;j++){
                if(prices[i]<=prices[j]){
                    cnt++;
                }
            }
            answer[i]=cnt;   
            cnt=0;
        }
        return answer;
    }
}

3. 결과

실행결과 실패. 테스트케이스만 통과하고 실제 검사에서는 모두 틀렸다.

4. 문제점

테스트케이스만 생각하고 원소에 작은 값이 나올 경우를 생각하지 않았다. 아래의 케이스도 생각해준다.

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

👊 두 번째 도전

1. 설계

  1. 이중for문을 돌다가 i보다 큰 j를 발견하면 그 뒤는 볼 필요도 없으므로 answer[i]=j-i를 넣고 break한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int[] solution(int[] prices) {
        int[] answer = {};
        answer=new int[prices.length];
        for(int i=0;i<prices.length-1;i++){
            for(int j=i+1;j<prices.length;j++){
                if(prices[i]>prices[j]){
                    answer[i]=j-i;
                    break;
                }
                if(j==prices.length-1){
                    answer[i]=j-i;
                }
            }
        }
        return answer;
    }
}
  • 라인12: i보다 큰 j를 발견했다면 유지한 초를 계산(j-i)후, break문으로 다음 i로 넘어간다.
  • 라인16: 마지막 j까지 체크했지만 i보다 큰 j를 발견하지 못했다면 유지한 초를 계산한다. 해당 if문은 i가 마지막 j까지 순회를 비교를 끝냈을 경우에만 answer에 값을 넣을 수 있도록 하였다.

3. 결과

실행결과 🤟 성공 🤟

👏 해결 완료!

스택, 큐 문제지만 배열을 이용해서 쉽게 풀 수 있었다. 여담으로 코드에 System 출력문을 써놓고 돌렸더니 효율성에서 죄다 실패가 떴었다. 출력문을 지우니 모두 성공하긴 했는데, 하마터면 더 좋은 효율성을 찾아 머리를 쥐어짤 뻔했다. 휴;