[백준] 11501번 주식

2025. 2. 24. 15:36·백준 문제/그리디

문제: 11501번: 주식

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

  • 내 풀이

 

#include <bits/stdc++.h>

using namespace std;

struct sorted {
    bool operator()(pair<int, int> a, pair<int, int> b) {
        // 우선 순위 큐는 기본적으로 최대힙으로 동작하기 때문에 비교 연산자의 의미가 일반적인 less<>와 반대로 적용된다.

        // 만약 가격이 같으면 인덱스 오름차순으로 정렬
        if (a.first == b.first)
            return a.second > b.second; // 그냥 벡터같은거였으면 a.second < b.second 인데 우선순위큐는 최대힙이므로 이를 반대로 해줘야함..

        // 가격이 다르면 가격 내림차순으로 정렬
        return a.first < b.first;
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    while (t-- > 0) {
        int n;
        cin >> n;

        // first 요소로 내림차순 정렬
        // first 는 가격, second 는 인덱스
        priority_queue<pair<int, int>, vector<pair<int, int>>, sorted> stocks;
        vector<int> stockPrices(n); // 주식 가격만 저장하기
        for (int i = 0; i < n; i++) {
            int price;
            cin >> price;
            stocks.push({ price, i });

            stockPrices[i] = price;
        }
        int curIdx = 0;
        int curCnt = 0;
        long long profit = 0;

        pair<int, int> maxStock = stocks.top();
        stocks.pop();

        while (!stocks.empty()) {
            if (curIdx < maxStock.second) {
                // 만약 현재 인덱스가 maxStock 의 인덱스보다 작으면 주식 구매~
                profit -= stockPrices[curIdx];
                curCnt++;
                curIdx++;
                continue;
            }

            if (curIdx == maxStock.second) {
                // 현재 인덱스가 maxStock 인덱스랑 같으면 주식 판매~
                profit += maxStock.first * curCnt;
                curCnt = 0;
                curIdx++;
            }
            // 현재 인덱스가 maxStock 인덱스보다 크거나 같을 때 새로운 maxStock 꺼내
            maxStock = stocks.top();
            stocks.pop();
        }
        cout << profit << "\n";
    }

    return 0;
}

 

 

흠.. 나는 우선 순위 큐 이용해서 풀었는데 다른 사람 풀이 보니까 우선 순위 큐 안 쓰고도 풀 수 있었다.

  • 효율적인 풀이
#include <iostream>
#include <vector>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    while (t-- > 0) {
        int n;
        cin >> n;

        vector<int> stockPrices(n);
        for (int i = 0; i < n; i++) {
            cin >> stockPrices[i];
        }

        long long profit = 0;
        int maxPrice = 0;

        // 오른쪽에서 왼쪽으로 탐색
        for (int i = n - 1; i >= 0; i--) {
            if (stockPrices[i] > maxPrice) {
                maxPrice = stockPrices[i]; // 최대값 갱신
            } else {
                profit += (maxPrice - stockPrices[i]); // 최대값보다 작으면 차익 계산
            }
        }

        cout << profit << "\n";
    }

    return 0;
}

 

 

 

참고자료:

https://chatgpt.com/share/67bc14ec-4400-800b-aa62-a474f8f3d712

 

ChatGPT - 비효율적 코드 최적화

Shared via ChatGPT

chatgpt.com

내가 짠 코드보다 훨씬 효율적인 코드를 짜줬다;; 이 방법을 계속 기억하고 있는게 좋을 것 같다. 우선 순위 큐를 너무 남발하면 안 될 것 같다;;

'백준 문제/그리디' 카테고리의 다른 글
  • [백준] 15903번 카드 합체 놀이
  • [백준] 2847번 게임을 만든 동준이
  • [백준] 13305번 주유소
  • [백준] 16953번 A -> B
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (335)
      • 프로그래밍언어론 정리 (0)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (193)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (15)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    우선순위큐
    스택
    백준
    이분탐색
    유니티 공부 정리
    C#
    BFS
    투포인터
    맵
    골드메탈
    그래프
    오블완
    백트래킹
    큐
    해시
    dp
    시뮬레이션
    언리얼
    티스토리챌린지
    바킹독
    이벤트 트리거
    재귀
    레트로의 유니티 프로그래밍
    유니티 프로젝트
    그리디
    유니티
    수학
    자료구조
    정렬
    이득우
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 11501번 주식
상단으로

티스토리툴바