[SWEA] 1859

ninano05·2026년 3월 26일

풀이 방식

  • 비싼 매매가가 뒤로 나와야한다.
  • 비싼 매매가가 중간에 나오면, 그때까지 금액을 계산하고 뒤에서 또 비싼 매매가를 찾아야 한다.
  • 즉 매매가 목록을 뒤에서부터 조회하면서, 가장 큰 값을 기록하고, 더 비싼 값이 나오면 그걸 기록하고 그 전까지 판매를 진행한다.
  • stack을 사용했는데, 너무 어렵게 풀려고 하는듯
import java.util.*;
import java.io.*;

public class Main {
    static Stack<Integer> stack; // 가격 기록 stack

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine());
        int n;
        StringTokenizer st;

        stack = new Stack<>();

        for(int i=0; i<t; i++) {
            n = Integer.parseInt(br.readLine());
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0; j<n; j++) {
                stack.add(Integer.parseInt(st.nextToken()));
            }
            bw.write("#"+(i+1)+" "+solution(n)+"\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }

    // 최대 매매가 구하는 로직
    public static long solution(int n) {
        long answer = 0; // 최종 가격
        long curPrice = 0; // 현재 구매 가격 합
        int max = 0; // 최댓값
        int count = 0;

        for(int i=0; i<n; i++) { // n대신 stack.size() 사용하면 stack은 가변이라서 문제 발생 size()는 while 쓰기
            int cur = stack.pop();
            if(cur > max) { // 새로운 최대값이 나오면 -> 이전까지 구매 정산
                answer = answer + ((long) max *count - curPrice); // 이전까지의 가격 반영
                max = cur; // 최대값 갱신
                count = 0; // 구매 개수 초기화
                curPrice = 0; // 구매 가격 합 초기화
            } else { // 매매하기
                curPrice += cur; // 현재 구매 가격 더하기
                count ++; // 구매 개수 1 증가
            }
        }
        // 마지막 매매 정산 (최대 값이 더 갱신 안 되는 경우)
        answer = answer + ((long) max *count - curPrice);

        return answer;
    }

}
profile
초보 개발자

0개의 댓글