CS/Algorism

[백준] 11501. 주식

olsohee 2023. 12. 6. 12:08

https://www.acmicpc.net/problem/11501

 

11501번: 주식

입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타

www.acmicpc.net

처음에는 입력 값을 배열에 넣은 뒤 배열의 앞에서부터 순차적으로 순회하니 조금 복잡해졌다. 그런데 배열의 뒤에서부터 순회하면 훨씬 깔끔하다.

  • 배열의 뒤에서부터 순회해서 max와 arr[j]를 비교한다.
    • max < arr[j]인 경우, max 값을 arr[j]로 갱신한다.
    • max >= arr[j]인 경우, answer에 max-arr[j] 값을 더해준다. (arr[j]를 max 값에 팔아 수익을 내는 것이다.)
  • 뒤에서부터 배열을 한 번 순회하기 때문에 O(N)의 시간 복잡도가 발생한다.
  • 주의할 점은 answer에 값이 더해지면서 int 범위를 넘을 수 있으므로 long 형으로 선언해야 한다.
import java.io.BufferedReader;
import java.io.IOException;

import java.io.InputStreamReader;
import java.util.StringTokenizer;

// 시간복잡도: O(N) = 1,000,000
public class Main {

    static int t;
    static int n;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            // 입력 및 배열 초기화
            n = Integer.parseInt(br.readLine());
            int[] arr = new int[n + 1];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                arr[j] = Integer.parseInt(st.nextToken());
            }

            // 주요 로직
            long answer = 0;
            int maxPrice = 0;
            for (int j = n - 1; j >= 0; j--) {
                if (maxPrice < arr[j]) {
                    maxPrice = arr[j];
                } else {
                    answer += maxPrice - arr[j];
                }
            }

            System.out.println(answer);
        }
    }
}

 반복문을 배열의 뒤에서부터 도는 것도 방법이다..! 유연하게 생각하자..

'CS > Algorism' 카테고리의 다른 글

[백준] 18808. 스티커  (0) 2023.12.08
[백준] 1744. 수 묶기  (1) 2023.12.06
[백준] 2457. 공주님의 정원  (2) 2023.12.05
[백준] 1931. 회의실 배정  (1) 2023.12.02
[백준] 14501. 퇴사  (0) 2023.11.30