[백준] 1826번 연료 채우기 (C++)

2025. 12. 3. 19:58·Algorithm
728x90

https://www.acmicpc.net/problem/1826

 

 

이 문제는 N개의 주유소가 주어지며 각각의 주유소에 대한 정보(시작 위치에서 주유소까지의 거리, 채울 수 있는 연료의 양)이 주어지며

 

마지막 줄에는 도착지점까지의 거리, 연료의 양이 주어진다.

 

이때 최소한에 주유소에 멈추는 횟수를 출력하며 만약 도착하지 못하는 경우 -1을 출력하는 문제이다.

 

최소한으로 주유소에 멈추는 횟수를 알아야하기 때문에 그리디하게 접근했다.

 

즉 만약 내가 주유소를 도착했다 하더라도 충전을 할지 안할지 선택해야된다는 의미이다.

 

이를 구현하기 위해서 주유소를 시작위치를 오름차순 순으로 정렬한 이후 최대힙을 사용하였다.

 

필자의 방법은 이러하다.

 

for문을 사용하여 주유소를 순회하되 주유소에 도착한다해도 바로 연료를 충전하지 않고 최대힙에 담아둔다.

 

이때 주유소를 다 순회하지 못하는 경우 우선순위 큐에서 하나씩 꺼내어 도착할 수 있는지 확인하였다.

 

이후 도착거리 지점까지도 마찬가지로 우선순위 큐에서 하나씩 꺼내 도착하는지 확인하였다.

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

struct horse {
    int x;
    int y;
    int dir;
};

// int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1};
// int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
// int dx[] = {0, 0, 1, -1};
// int dy[] = {1, -1, 0, 0};
int dx[] = {1, 0};
int dy[] = {0, 1};
int N, L, P;
vector<pii> v;
priority_queue<int> pq;

void Print() {
    for(auto it : v) {
        cout << it.first << " " << it.second << endl;
    }
}

void solve() {
    if(L <= P) {
        cout << 0;
        return;
    }

    sort(v.begin(), v.end());

    int gas = P;
    int answer = 0;
    int located = 0;
    for(int i = 0; i < N; i++) {
        int locate = v[i].first;
        int gasAddit = v[i].second;

        if(gas <= locate) {
            while(!pq.empty() && gas <= locate) {
                gas += pq.top();
                pq.pop();
                answer++;
            }

            if(gas < locate) {
                cout << -1;
                return;
            }
        }
        pq.push(gasAddit);
    }

    while(!pq.empty() && gas < L) {
        gas += pq.top();
        pq.pop();
        answer++;
    }

    if(gas >= L) {
        cout << answer;
    }
    else cout << -1;
}

void input() {
    cin >> N;

    for(int i = 0;  i < N; i++) {
        int a, b;
        cin >> a >> b;
        v.push_back({a, b});        // 위치, 채울 수 있는 양
    }

    cin >> L >> P;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 14925번 목장 건설하기 (C++)  (0) 2025.12.22
[백준] 20303번 할로윈의 양아치 (C++)  (0) 2025.12.21
[백준] 2613번 숫자구슬 (C++)  (0) 2025.12.02
[백준] 1781번 컵라면 (C++)  (0) 2025.12.01
[백준] 16441번 아기돼지와 늑대 (C++)  (0) 2025.11.30
'Algorithm' 카테고리의 다른 글
  • [백준] 14925번 목장 건설하기 (C++)
  • [백준] 20303번 할로윈의 양아치 (C++)
  • [백준] 2613번 숫자구슬 (C++)
  • [백준] 1781번 컵라면 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    DFS
    구현
    그래프 이론
    백트래킹
    우선순위큐
    우선순위 큐
    누적합
    재귀
    백준
    다이나믹 프로그래밍
    그리디
    트리
    정렬
    linux
    에라토스테네스의 체
    Bandit
    BFS
    깊이우선탐색
    Leviathan
    시뮬레이션
    브루트포스
    DP
    wargame
    다익스트라
    c언어
    WebSecurity
    이분탐색
    비트마스킹
    투포인터
    코딩
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1826번 연료 채우기 (C++)
상단으로

티스토리툴바