fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 30504 (C++) 세과영엔 슬픈 전설이 있어
최초 업로드: 2025-09-14 11:23:57
최근 수정 시간: 2025-09-14 11:23:57
게시자: rlatjwls3333
카테고리: 백준
조회수: 4
# [Silver III] 세과영엔 슬픈 전설이 있어 [문제 링크](https://www.acmicpc.net/problem/30504) ## 문제 설명 <p>세종이는 영재에게 빌려준 돈을 현재까지도 받지 못했다. 세종이는 영재에게 돈을 갚으라고 여러 번 독촉했지만, 슬프게도 영재는 세종이의 말을 알아듣지 못하는 것 같다. 그래서 세종이는 영재에게 마지막 유예 기간 $N$일을 주었다. 영재는 세종이가 준 $N$일 동안 빌린 돈을 모두 갚아야 한다.</p> <p>세종이와 영재에게는 특이한 규칙이 있다. 세종이는 $i$일째 되는 날에 $A_i$ 만큼 분노한다. 만약 $i$일에 세종이가 $A_i$원 이상의 돈을 받지 못한다면 세종이는 영재에게 분노를 표출하게 된다. 영재는 자신이 가진 돈을 $N$개의 자루에 나누어 담아 세종이에게 하루에 한 자루씩 주려고 한다.</p> <p>세종이가 받아야 하는 최소 금액과 영재가 나눠 담은 금액이 주어졌을 때, 영재가 세종이의 분노를 피해 빚을 갚는 방법을 찾는 프로그램을 작성하시오.</p> ## 입력 <p>첫째 줄에 유예 기간의 날짜 수 $N$이 주어진다. $(1\leq N\leq 200\, 000)$</p> <p>둘째 줄에 $N$개의 양의 정수 $A_1$, $A_2$, $\cdots$, $A_N$이 공백으로 구분되어 주어진다. 이때 $A_i$는 $i$번째 날에 세종이가 받아야 하는 최소 금액이다. $(1\le A_i\le 10^{8})$</p> <p>셋째 줄에 $N$개의 양의 정수 $B_1,B_2,\cdots ,B_N$이 공백으로 구분되어 주어진다. 이때 $B_j$는 영재가 $j$번째 자루에 담은 금액이다. $(1\le B_j\le 10^{8})$</p> <p>$\sum_{i=1}^{N}{A_i}\le 2\times 10^{9};$ $\sum_{j=1}^{N}{B_j}\le 2\times 10^{9}$ 이다.</p> ## 출력 <p>영재가 $1$일부터 $N$일까지 각 날마다 지불해야 하는 금액을 공백으로 구분해 출력한다.</p> <p>만약 빚을 갚는 것이 불가능해 세종이가 분노를 표출하게 된 경우 대신 <span style="color:#e74c3c;"><code>-1</code></span>을 출력한다.</p> <p>가능한 답이 여러 가지인 경우 그 중 아무거나 하나만 출력한다.</p> ## 풀이 A와 B를 정렬해서 가능하다면 순서대로 대입하면 됩니다. ``` c++ #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<pair<int, int>> a(n); for(int i=0;i<n;i++) { cin >> a[i].first; a[i].second=i; } vector<int> b(n); for(int i=0;i<n;i++) cin >> b[i]; sort(a.begin(), a.end()); sort(b.begin(), b.end()); vector<int> ret(n); for(int i=0;i<n;i++) { if(a[i].first>b[i]) { cout << -1; return 0; } ret[a[i].second]=b[i]; } for(int e : ret) cout << e << ' '; } ```