개인사
[G2] 백준 1826번 연료 채우기 C++ 그리디 알고리즘, 우선순위 큐 본문
728x90

리뷰

https://www.acmicpc.net/problem/1826
우선순위 큐 2개를 사용해서 마을에 도달하기 까지 최소한의 주유소 방문 횟수를 구하는 문제
전역 변수
- n : 주유소의 개수를 저장할 변수
- ans : 주유소 방문 횟수를 저장할 변수
- Station : 주유소 위치와 채울 수 있는 연료의 양을 정의할 구조체, 위치를 기준으로 오름차순 정렬한다.
함수
없음
문제풀이
- Station타입의 우선순위 큐 pq1을 초기화 한다.
- n값을 입력 받고, n개의 주유소 위치와 채울 수 있는 연료의 양을 pq1에 추가한다.
- 정수형의 우선순위 큐 pq2를 초기화한다.
- l, p값을 입력 받고, pq1에서 p이하에 위치한 주유소를 꺼내 충전량을 pq2에 추가한다.
- p가 l보다 작으면서 pq2가 비지 않았다면 while루프를 수행한다.
- 매 루프마다 ans를 증가시키고, p에 pq2의 top을 더해준 뒤 pq2에서 요소를 제거한다.
- pq1에서 갱신된 p이하에 위치한 주요소를 꺼내 충전량을 pq2에 추가한다.
- while루프가 종료된 후에도 p가 l보다 작다면 -1을, 아니라면 ans를 출력한다.
트러블 슈팅
- while루프가 종료되었을때 p가 l보다 큰지 여부를 구분하여 출력하지 않아 WA를 받았다.
- p가 l보다 작을 경우 ans가 아닌 -1을 출력하게 변경하여 AC를 받았다.
참고 사항
- 모든 주유소와 마을은 서로 다른 좌표에 있고, 마을은 모든 주유소보다 오른쪽에 있다.
- b(1 ≤ b ≤ 100), L(1 ≤ L ≤ 1,000,000), P(1 ≤ P ≤ 1,000,000)로 long long타입을 고려할 필요가 없다.
정답 코드
#include<iostream>
#include<queue>
using namespace std;
int n, ans;
struct Station {
int x, c;
bool operator<(const Station& other) const {
return x > other.x;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
priority_queue<Station> pq1;
cin >> n;
for (int i = 0; i < n; ++i) {
int x, c; cin >> x >> c;
pq1.push({ x, c });
}
priority_queue<int> pq2;
int l, p; cin >> l >> p;
while (!pq1.empty() && pq1.top().x <= p) {
pq2.push(pq1.top().c);
pq1.pop();
}
while (p < l && !pq2.empty()) {
ans++;
p += pq2.top();
pq2.pop();
while (!pq1.empty() && pq1.top().x <= p) {
pq2.push(pq1.top().c);
pq1.pop();
}
}
cout << (p < l ? -1 : ans);
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G5] 백준 20208번 진우의 민트초코우유 C++ 백트래킹 (0) | 2025.10.31 |
|---|---|
| [G4] 백준 25515번 트리 노드 합의 최댓값 C++ 트리, 다이나믹 프로그래밍 (0) | 2025.10.30 |
| [G3] 백준 2457번 공주님의 정원 C++ 그리디 알고리즘, 우선순위 큐 (0) | 2025.10.29 |
| [G2] 백준 1135번 뉴스 전하기 C++ 트리, 깊이 우선 탐색, 그리디 알고리즘, 정렬 (0) | 2025.10.29 |
| [G1] 백준 1113번 수영장 만들기 C++ 구현, 시뮬레이션, 너비 우선 탐색, 플러드 필 (0) | 2025.10.29 |
