본문 바로가기
프로그래밍/알고리즘 문제풀이

[pg] 프로그래머스 주식가격

by 노잼인간이라불립니다 2023. 7. 23.

0. 개요

 최근 코딩 테스트 문제를 다시 풀어보면서 자료구조/알고리즘의 학습 필요성을 느끼고 다시 공부 중이다. 이전에는 알고리즘 배우고 들입다 문제풀고, 좌절하고 반복이었지만, 아직 시간이 많이 남은 만큼 차근차근 하나하나 해볼 생각이다. 너무 급하게 서두르지 않는게 목표다.

1. 문제 정의

주식 가격이 떨어질 때 까지의 시간을 구하는 문제이다. 초마다의 주식가격이 배열로 주어지고, 배열을 순회하면서 현재 인덱스에 존재하는 data 값보다 미만으로 떨어지는 시점의 시간을 구하는 문제이다.

주어지는 것: 각 초마다의 주식가격

output: 현재 인덱스의 값보다 가격이 미만인 값이 되기 까지의 시간(초)을 담은 배열.

2. 나의시도

 스택/큐에 속해 있는 문제라고 해서 스택이나 큐로 풀으려고 생각했지만, 문제를 읽고 결국엔 하나를 잡고 쭉 선형탐색을 해야하는 구조라서 이중 for문을 이용해서 시도해보았다. 그랬더니 테스트케이스가 모두 통과되었다. 아마 스택이나 큐를 이용하더라도 성능은 비슷했을 것이라고 생각한다.

 스택이라는 자료구조를 이용하지는 않았지만, 선형탐색을 해야하는 부분은 같아서 속도는 비슷했던 것 같다.

3. 코드

/**
 * @author 
 * @since 2023-07-19
 * <p>
 * 주제: 큐/스택
 * 문제: 주식가격
 * 문제 정의:
 * 배열안에 있는 주식 가격이 현재 가격보다 안 떨어진 기간을 구한다. 1칸 당 1초
 * <p>
 * 접근 방법: for문 진행하면서 답을 찾으면 break 하는 형식으로 구현
 */
public class Solution {
    public static void main(String[] args) {
        int[] solution = solution(new int[]{1, 2, 3, 2, 3});
        Arrays.stream(solution).forEach(number -> System.out.println(number));
    }

    public static int[] solution(int[] prices) {
        int[] answer = new int[prices.length];

        // target으로 삼을 주식 가격을 하나씩 체크
        for (int i = 0; i < prices.length; i++) {
            int price = prices[i]; // 타겟 주식 가격
            int time = 0 ; // 유지되는 시간

            // 초를 증가시키면서 target보다 낮은 주식가격이 나타나면 정답 배열에 저장하고 브레이크.
            for (int j = i+1; j < prices.length; j++) {
                time++;
                if (prices[j] < price){
                    answer[i] = time;
                    break;
                }
            }
            answer[i] = time; // 낮은 가격을 못찾았을 경우 지금까지의 시간을 정답배열에 저장.
        }
        return answer;
    }
}

4. 정리 및 깨달은 점

 이번 문제는 쉬운편에 속했지만, 앞으로의 코딩테스트를 위해서는 자료구조/알고리즘 학습이 필수라는 판단을 내리고 7월달은 자료구조/알고리즘 학습에 집중해볼 계획이다. 7월안에 대략적이라도 정리가 되면 다행이겠지만, 시간이 더 걸릴 수도 있을 것 같다.

 

참조

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