알고리즘/SW Expert Academy

1859. 백만 장자 프로젝트

문제 정보: 1983. 조교의 성적 매기기

 

1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
3. 판매는 얼마든지 할 수 있다.

 

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스 별로 첫 줄에는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고,
둘째 줄에는 각 날의 매매가를 나타내는 N개의 자연수들이 공백으로 구분되어 순서대로 주어진다.
각 날의 매매가는 10,000 이하이다.

[출력]
각 테스트 케이스마다 ‘#x’(x는 테스트 케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 최대 이익을 출력한다.

[예제 풀이]
1번째 케이스는 아무것도 사지 않는 것이 최대 이익이다.
2번째 케이스는 1,2일에 각각 한 개씩 사서 세 번째 날에 두 개를 팔면 10의 이익을 얻을 수 있다.

입력

3
3
10 7 6
3
3 5 9
5
1 1 3 1 2
출력

#1 0
#2 10
#3 5
import java.text.DecimalFormat;
import java.util.Scanner;

public class solution_1859 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T, N;
        T = sc.nextInt();


        for(int test_case = 1; test_case <= T; test_case++) {
            //세팅
            N = sc.nextInt();
            if(N < 2 || N > 1000000){
                break;
            }

            double[] numArray = new double[N];
            for(int i = 0; i < N; i++) {
                numArray[i] = sc.nextInt();
            }

            //로직 처리
            double result = logicProc(numArray);

            //결과 소수점 없이 치환
            DecimalFormat df = new DecimalFormat("#");
            String StrResult = df.format(result);

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

    //로직 처리
    public static double logicProc(double[] numArray){
        double result = 0;
        boolean isLastIndex = false;
        for(int i = numArray.length-1; i > -1; i--) {
            for(int j = i-1; j > -1; j--) {
                if(numArray[j] >= numArray[i]) {
                    i = j+1;
                    break;
                } else {
                    result += numArray[i] - numArray[j];
                }

                if(j == 0){
                    isLastIndex = true;
                    break;
                }
            }

            if(isLastIndex){
                break;
            }
        }

        return result;
    }
}