๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

[swea] 1859. ๋ฐฑ๋งŒ ์žฅ์ž ํ”„๋กœ์ ํŠธ

๋ฌธ์ œ: 1859. ๋ฐฑ๋งŒ ์žฅ์ž ํ”„๋กœ์ ํŠธ
๋‚ ์งœ: 08/28 (์ˆ˜)
์„ฑ๊ณต์—ฌ๋ถ€: O(๋Œ“๊ธ€ํžŒํŠธ)

 

๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๋ฆฌ๋””์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ์•ˆ๋˜์–ด์žˆ์–ด์„œ ์ข€ ์–ด๋ ค์› ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋’ค๋กœ ๋ฐ˜๋ณตํ•ด์„œ ํ’€๋ฉด ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฌด์กฐ๊ฑด ๋ฐฐ์—ด์„ ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์•ผํ•œ๋‹ค.. ์ด๊ฒŒ ์ฐธ ์‰ฌ์šด๋ฐ ์–ด๋ ค์šด๋“ฏํ•˜๋‹ค.

 

์ฒ˜์Œ ํ’€์ด๋Š” ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ํ˜„์žฌ ๊ฐ’์—์„œ ๋ฐ”๋กœ ๋’ค์— ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋‚˜์˜ค๋ฉด ํ˜„์žฌ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฐ ๋ฌผ๊ฑด๋“ค์„ ํŒ”์•„ ๊ทธ ์ฐจ์•ก์„ ret ๋ณ€์ˆ˜์— ๋”ํ–ˆ๋‹ค. ์˜ˆ์ œ๋งŒ ๋†“๊ณ ๋ณด๋ฉด ํ•ด๋‹น ๋กœ์ง์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•„๋ž˜ ๋ฐ˜๋ก€๊ฐ€ ์žˆ๋‹ค.

1 2 3 5 2 4 7 1

1 2 3 5 2 4๊นŒ์ง€ ๋ชจ๋‘ ์‚ฐ๋‹ค์Œ์— 7์—์„œ ํŒ”๋ฉด ์ตœ๋Œ€ ์ด์ต!
๊ทธ๋Ÿฌ๋‚˜, ์œ„์˜ ๋กœ์ง๋Œ€๋กœ ํ•œ๋‹ค๋ฉด 1 2 3 ๊นŒ์ง€ ์‚ฐ ํ›„ 5์—์„œ ๋ชจ๋‘ ํŒ”๊ณ , ๋‹ค์‹œ 2 4๊นŒ์ง€ ์‚ฐ ํ›„ 7์—์„œ ํŒ๋งคํ•œ๋‹ค.

 

์ด๋Ÿฐ ๋ฐ˜๋ก€๋ฅผ ์ƒ๊ฐ๋ชปํ•ด์„œ ๋Œ“๊ธ€์„ ์ฐธ๊ณ ํ–ˆ๊ณ  ๋’ค์—์„œ ํ’€๋ฉด ๋œ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ ์ƒ๊ฐ์„ ๊ฐ–๊ณ  ๋‹ค์‹œ ํ’€์—ˆ๋‹ค.

 

๋ฐฐ์—ด์˜ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  max ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋ฉด์„œ max ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ์‚ฌ๋†“๊ณ  max์—์„œ ํŒ๋งคํ•˜๋ฉด ๊ทธ๋•Œ๊ฐ€ ์ œ์ผ ์ด๋“์„ ๋ณผ ์ˆ˜์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ˆ๊นŒ ๊ทธ ์ฐจ์•ก์„ ๊ณ„์‚ฐํ•ด ret์— ๋”ํ•ด์ค€๋‹ค. ์œ„์˜ ์˜ˆ์ œ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด

1 2 3 5 2 4 7 1
์ฒ˜์Œ์— max = 1

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์›์†Œ๋กœ ๊ฐ€๋ฉด max < 7 ์ด๊ธฐ ๋•Œ๋ฌธ์— max = 7์ด ๋˜๊ณ 
์ดํ›„๋ถ€ํ„ฐ๋Š” ๊ณ„์† max > 4 or 2 or 5 or 3 or 2 or 1์ด๋‹ค.
๊ทธ๋Ÿผ max ๊ฐ’์— ํ•ด๋‹น ์›์†Œ๋ฅผ ๋นผ์„œ ๊ทธ ์ฐจ์•ก์„ ๊ณ„์† ret์— ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

์ฝ”๋“œ

import java.util.Scanner;

public class Solution {

    static int[] gold;
    static long ret;

    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int n = sc.nextInt();

            gold = new int[n];
            for (int i = 0; i < n; i++) gold[i] = sc.nextInt();

            ret = 0;
            int max = 0;
            for (int i = n-1; i >= 0; i--) {
                if (gold[i] > max) max = gold[i];
                else ret += (max - gold[i]);
            }

            System.out.println("#" + test_case + " " + ret);
        }
    }
}