Algorithm/SW Expert Academy

[SWEA] 1859 백만 장자 프로젝트

SSONGMI 2021. 1. 27. 23:31
반응형

1. 배열의 사이즈를 입력받는다.

2. 배열에 값을 넣어준다.

3. 배열에 접근하게 되는데 이때 뒤에서부터 접근한다.

→ 앞에서 접근하게되면 해당 번째의 수가 그 다음에 나올 수보다 크다는 것을 장담할 수 없게 되고, 따라서 그 당시에 파는 가격이 최고 이익을 내는 가격이라고 볼 수 없다.

→ 만약 뒤에서 접근한다면 해당 번째 보다 더 큰 수가 나오기 전까지 샀던 모든 제품을 가장 비싸게 파는 것은 현재 접근한 수라고 보장할 수 있게 된다.(어차피 그 전에 존재하는 큰 수에서는 그 다음에 산 제품을 팔지 못하니까)

4. 만약 가장 큰 수를 갱신할 차례가 오면 현재 발견한 수 다음부터 지금까지 가장 큰 수였던 자리까지 모두 산 가격으로 볼 수 있다. 따라서 그 요소들은 -arr[j]로 계산해주고 MAX 값을 더해준다.

5. 그 다음 MAX값을 현재 발견한 최대 큰 값으로 바꿔준다. 이때 현재 발견한 수 다음은 모두 처리되었으므로

end를 현재 값으로 지정해 준다(배열의 인덱스)

6. 만약 마지막이 가장 큰 수였고 그 전은 점점 작아지는 경우에는 if 문을 거칠 수 없으므로 i가 0일 때를 따로 처리해 준다. 

 

import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
         
        int T = sc.nextInt();
         
         
        for(int tc = 1; tc <= T; tc++ ) {
            int N = sc.nextInt();
            int[] arr = new int[N];
            int end = N-1;
            long sum = 0;
            for(int i = 0; i < arr.length; i++)
                arr[i] = sc.nextInt();
            long MAX = arr[N-1];
            for(int i = arr.length-1; i >= 0; i-- ) {
                if(arr[i] > MAX) {
                    for(int j = i + 1; j < end; j++) {
                        sum += (-arr[j] + MAX);
                    }
                    MAX = arr[i];
                    end = i;
                }else if(i == 0) {
                    for(int j = 0; j < end; j++) {
                        sum += (-arr[j] + MAX);
                                                 
                    }
                }
            }
            System.out.println("#" + tc + " " + sum);
        }
    }
}
반응형