[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 73장~75장
오늘도 한다 알고리즘!!!
73장. 최대힙(priority_queue : 우선순위 큐)
최대힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드 값이 왼쪽 자식과 오른쪽 자식 노드의 값보다 크게 트리를 구성하는 것입니다. 그렇개 하면 트리의 루트(root) 노드는 입력된 값들 중 가장 큰 값이 저장되어 있습니다. 예를들어 5 3 2 1 4 6 7 순으로 입력되면 최대힙 트리는 아래와 같이 구성됩니다.

최대힙 자료를 이용하여 다음과 같은 연산을 하는 프로그램을 작성하세요.
1) 자연수가 입력되면 최대힙에 입력한다.
2) 숫자 0이 입력되면 최대 힙에서 최댓값을 꺼내어 출력한다. (출력할 자료가 없으면 -1를 출력한다.)
3) -1이 입력되면 프로그램을 종료한다.
입력
첫 번째 줄부터 숫자가 입력된다. 입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정수형 범위에 있다.
출력
2) 연산을 한 결과를 보여준다.
나의 코드
나는.. 못풀었다. 선생님 코드를 바로 보면
선생님 코드
여기서 Key Point는 priority_queue는 이미 stl에 정의되어 있다는 점!!
그냥 있는 것을 가져다가 쓰면 된다.
#include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; int main(){ //freopen("input.txt", "rt", stdin); int a; priority_queue<int> pQ; while(true){ scanf("%d", &a); if(a==-1){ break; } if(a==0){ if(pQ.empty()) printf("-1\n"); else{ printf("%d\n", pQ.top()); pQ.pop(); } }else{ pQ.push(a); } } return 0; }
잊지말자 priority_queue <int> pQ;
...
74장. 최소힙 (priority_queue : 우선순위 큐)
최소힙은 완전 이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드 값이 왼쪽자식과 오른쪽 자식 노드의 값보다 작게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root) 노드는 입력된 값들 중 가장 작은 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7 순으로 입력되면 최소 힙 트리는 아래와 같이 구성됩니다.

최소힙 자료를 이용하여 다음과 같은 연산을 하는 프로그램을 작성하세요.
1) 자연수가 입력되면 최소힙에 입력한다.
2) 숫자 0이 입력되면 최소힙에서 최솟값을 꺼내어 출력한다. (출력할 자료가 없으면 -1를 출력한다.)
3) -1이 입력되면 프로그램을 종료한다.
입력
첫 번째 줄부터 숫자가 입력된다. 입력되는 숫자가 100,000개 이하이며 각 숫자의 크기는 정수형 범위에 있다.
출력
2) 연산을 한 결과를 보여준다.
나의 코드
#include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; int main(){ //freopen("input.txt", "rt", stdin); int a; priority_queue<int, vector<int>, greater<int>> pQ; while(true){ scanf("%d", &a); if(a==-1){ break; } if(a==0){ if(pQ.empty()) printf("-1\n"); else{ printf("%d\n", pQ.top()); pQ.pop(); } }else{ pQ.push(a); } } return 0; }
priority_queue를 선언할 때 priority_queue<int, vector<int>, greater<int>> pQ;
라고 선언 하면 된다!! (왕신기)
선생님 코드
와 선생님은 완전 신기하게 푸셨다...
음수 처리 해버리면 됨!!!
#include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; int main(){ //freopen("input.txt", "rt", stdin); int a; priority_queue<int> pQ; while(true){ scanf("%d", &a); if(a==-1){ break; } if(a==0){ if(pQ.empty()) printf("-1\n"); else{ printf("%d\n", -pQ.top()); pQ.pop(); } }else{ pQ.push(-a); } } return 0; }
그냥 마이너스만 넣어버리셨다. 역시.. 선생님은 천재야
75장. 최대 수업 스케줄 (priority_queue 응용 문제)
현수는 유명한 강연자이다. N개의 기업에서 강연 요청을 해왔다. 각 기업은 D일 안에 와서 강연을 해주면 M만큼의 강연료를 주기로 했다.
각 기업이 요청한 D와 M를 바탕으로 가장 많은 돈을 벌 수 있도록 강연 스케줄을 짜야한다.
단, 강연의 특성상 현수는 하루에 하나의 기업에서만 강연을 할 수 있다.
입력
첫 번째 줄에 자연수 N(1<=N<=10,000)이 주어지고, 다음 N개의 줄에 M(1<=M<=10,000)과 D(1<=D<=10,000)이 차례로 주어진다.
출력
첫 번째 줄에 최대로 벌 수 있는 수입을 출력한다.
나의 코드
#include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; int main(){ //freopen("input.txt", "rt", stdin); int N, M, D; priority_queue<pair<int, int>> pQ; cin >> N; for(int i=0; i<N; i++){ cin >> M >> D; pair<int, int> p; p.first = M; p.second = D; pQ.push(p); } int result = 0; int day = N; while(day > 0 && !pQ.empty()){ pair<int, int> p; p = pQ.top(); pQ.pop(); if(day - p.second >= 0){ result += p.first; day -= p.second; }else{ continue; } } cout << result << endl; return 0; } /* input 6 50 2 20 1 40 2 60 3 30 3 30 1 */
나는 이렇게 했는데.. 틀린거다!!
first랑 second를 비교하고 가장 최선의 값을 선택해주어야하는데 나는 틀림.. 선생님 코드를 보도록 하자.
선생님 코드
#include <stdio.h> #include <algorithm> #include <vector> #include <queue> using namespace std; struct Data{ int money; int when; Data (int a, int b){ money = a; when = b; } bool operator < (Data &b){ return when > b.when; } }; int main(){ int n, i, j, a, b, res=0, max = -2147000000; vector<Data> T; priority_queue<int> pQ; scanf("%d", &n); for(i=1; i<=n; i++){ scanf("%d %d", &a, &b); T.push_back(Data(a, b)); if(b>max) max = b; } sort(T.begin(), T.end()); j = 0; for(i=max; i>=1; i--){ //i는 날짜. 날짜는 뒤에서부터 확인한다. for(; j<n; j++){ if(T[j].when < i) break; // 날짜가 작으면 그냥 스루해버린다~ pQ.push(T[j].money); } if(!pQ.empty()){ res += pQ.top(); pQ.pop(); } } printf("%d\n", res); return 0; }
이렇게 된다!!! 사실 아직 저 for문 부분을 이해를 하질 못하겠다. (,,)bool operator <
선언해준 것으로 저렇게 sort가 되는 것도 넘 신기하다.
'알고리즘 Algorithm ' 카테고리의 다른 글
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python) (0) | 2021.04.23 |
---|---|
[Algorithm] 트라이(Trie)와 관련 문제들 (Python) (0) | 2021.04.11 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장 (0) | 2020.07.05 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 70장 ~ (0) | 2020.07.03 |
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 62장 ~ 63장 (0) | 2020.06.27 |
댓글
이 글 공유하기
다른 글
-
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python)
[Algorithm] DFS와 BFS 기본 개념 및 관련 문제들 (python)
2021.04.23시작하기에 앞서… 그래프의 표현 방법 그래프는 표현하는 방법을 크게 두가지로 나눌 수 있습니다. 하나는 인접 행렬, 다른 하나는 인접 리스트입니다. 1. 인접 행렬 (Adjacency Matrix) 2차원 배열로 그래프의 연결관계를 표현하는 방식입니다. INF = float('inf') graph = [ [0, 7, 5], [7, 0, INF], [5, INF, 0] ] 2. 인접 리스트 (Adjacency List) 리스트로 그래프의 연결관계를 표현하는 방식입니다. 저의 경우에는 딕셔너리나 collections에 있는 defaultdict를 사용합니다. 둘이 똑같이 키-값의 구조라서 빠른 접근이 가능하다는 점에서 사용하기 편리한 것 같습니다ㅎㅎ 아래는 defaultdict를 사용한 방법입니다. gra… -
[Algorithm] 트라이(Trie)와 관련 문제들 (Python)
[Algorithm] 트라이(Trie)와 관련 문제들 (Python)
2021.04.11트라이란? 문자열을 효과적으로 탐색하기 위한 자료구조로, 문자열을 순차탐색하는 방식이 아닌 트리로 접근하기 위해 만들어진 자료구조입니다. 주로 Prefix Tree, digital search Tre, retrieval tree라고도 불리는데, retrieval tree의 trie를 따와 트라이라고 일반적으로 불립니다. 트라이는 문자열을 key로 사용하는 동적은 set 또는 연관배열을 저장하는 트리의 확장된 구조입니다. 문자열을 탐색할 때 단순하게 하나씩 비교하지 않고 key로 노드들을 탐색해나가기때문에 매우 효율적이라는 장점이 있습니다. 단, 빠르게 탐색 가능하지만 각 노드에서 자식들에 대한 포인터들을 배열로 모두 저장하고 있다는 점에서 저장 공간의 크기가 크다는 단점이 있습니다. 위 사진을 보시면 아… -
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 72장
2020.07.0572장. 공주 구하기 (큐 자료구조로 해결) 정보왕국의 이웃나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다. 정보왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다. 정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다. 왕은 왕자들의 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다. 그리고 1번 왕자부터 N번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다. 그리고 1번 왕자부터 시계 방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다. 한 왕자가 K(특정 숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다. 그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다. 이렇게 해서 마지막까지 남은 왕자가 공주를 구… -
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 70장 ~
[Algorithm] 인프런 강좌 따라하며 배우는 알고리즘! 70장 ~
2020.07.0370장. 그래프 최단거리 (BFS) 다음 그래프에서 1번 정점에서 각 정점으로 가는 최소 이동 간선수를 출력하세요. 입력 첫째 줄에는 정점의 수 N(1 N >> M; for(int i=0; i> from >> to; map[from].push_back(to); } for(int i=2; i
댓글을 사용할 수 없습니다.