[백준] 14464번 소가 길을 건너간 이유 4

2026. 2. 5. 00:29·Algorithm
728x90

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

 

 

문제 이해

이 문제는 C개의 닭과 N개의 소가 주어진다. 이때 각 닭들은 c초에 길을 건널 수 있으며 각 소들은 a, b가 주어지며 a부터 b까지 길을 건널 수 있다. 이때 닭은 소가 길을 건너줄 수 있는걸 도와줄 수 있으며 a <= c <= b일때 가능하다. 이때 최대로 소를 도와줄 수 있는 닭의 개수를 출력해야 한다.

 

문제 접근

 

처음엔 이분탐색을 사용하여 소의 시간을 끝시간에서 부터 시작 시간까지 탐색하려고 했지만 주어지는 시간이 10억이기에 불가능하다고 생각했다 따라서 오름차순으로 정렬하여 시간이 매칭될때 하나씩 더해주는 방법을 생각하였다. 하지만 반례를 생각해보면 무조건 시간이 매칭된다고 하나씩 더해주면 안된다

 

닭 : 5, 100

소 : (1, 100), (4, 6)

인 경우 5인 닭이 (1, 100)이 매칭이 된다 하지만 최적은 5인 닭이 (4, 6)과 매칭되고 100인 닭이 (1, 100)과 매칭되어야 하기 때문에 끝시간을 기준으로 가장 근접한 시간을 매칭해야 하기 때문에 우선순위 큐를 사용하였고

시작 시간을 기준으로 가능한 소들의 끝시간을 우선순위 큐에 넣어주었고 이후 닭의 시간과 우선순위 큐의 가장 작은 루트의 시간과 비교하여 가능하지 않은 경우 가능할때까지 pop을 해주었다.

 

이후 가능한 경우 하나를 pop해주고 개수를 1을 더해주었다.

 

정답코드

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

struct Tree {
    int Node, left, right;
};

const int INF = 1e9;
const int MAX = 200001;
const int MOD = 1e9 + 7;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int C, N;
priority_queue<int, vector<int>, greater<int>> pq;
vector<pii> v;
vector<int> arr;

void solve() {
    sort(v.begin(), v.end());
    sort(arr.begin(), arr.end());

    int idx = 0;
    int cnt = 0;

    for(int i = 0; i < C; i++) {

        int chicken = arr[i];

        while(idx != N && v[idx].first <= chicken) {        // 가능한 소들 탐색
            pq.push(v[idx].second);
            idx++;
        }

        while(!pq.empty() && pq.top() < chicken) {
            pq.pop();
        }

        if(!pq.empty()) {
            cnt++;
            pq.pop();
        }
    }

    cout << cnt;
}

void input() {
    cin >> C >> N;

    for(int i = 1; i <= C; i++) {
        int a;
        cin >> a;
        arr.push_back(a);
    }

    for(int i = 0; i < N; i++) {
        int a, b;
        cin >> a >> b;
        v.push_back({a, b});
    }
}

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

    input();
    solve();
}

 

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

'Algorithm' 카테고리의 다른 글

[LeetCode] Binary Lifiting를 사용한 최소공통조상 최적화  (0) 2026.06.14
[백준] 1132번 합 (C++)  (0) 2026.03.15
[백준] 9489번 사촌 (C++)  (0) 2026.01.04
[백준] 17835번 면접보는 승범이네 (C++)  (0) 2026.01.03
[백준] 12908번 텔레포트 3 (C++)  (0) 2025.12.31
'Algorithm' 카테고리의 다른 글
  • [LeetCode] Binary Lifiting를 사용한 최소공통조상 최적화
  • [백준] 1132번 합 (C++)
  • [백준] 9489번 사촌 (C++)
  • [백준] 17835번 면접보는 승범이네 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • 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 (5)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 14464번 소가 길을 건너간 이유 4
상단으로

티스토리툴바