백준
백준1092 - 배
개발하는꼬마
2019. 11. 25. 22:19
https://www.acmicpc.net/problem/1092
1092번: 배
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
가장 무거운 것을 옮길 수 있는 크레인부터 가장 가벼운 것을 옮길 수 있는 크레인까지 차례대로 분배한다. 옮기는 과정에서 옮길 수 없는 박스를 만났다면 인덱스를 증가시키지 않고 다음 박스로 넘어간다. 이렇게 되면 언젠가는 옮길 수 있는 박스가 있거나 옮기지 못한 채로 다음 순서로 넘어가는 경우가 생긴다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int m, n; //m은 크레인 개수, n은 상자 갯수
int num; //각 벡터의 요소
int cnt = 0; //몇 분만에 옮겼는지
vector<int> v1, v2; //v1은 크레인 정보, v2는 상자 정보
//크래인 정보 입력
cin >> m;
for (int i = 0; i < m; i++) {
cin >> num;
v1.push_back(num);
}
//박스 정보 입력
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num;
v2.push_back(num);
}
//내림차순으로 정렬
sort(v1.begin(), v1.end(), greater<int>());
sort(v2.begin(), v2.end(), greater<int>());
if (v2[0] > v1[0]) { //들 수 있는 최대 무게보다 무거운 상자가 있는 경우
cout << -1;
}
else { //그 외의 경우
while (v2.size()) { //상자의 갯수가 0이 되기 전까지 반복
int index = 0; //크레인의 순서
for (int i = 0; i < v2.size(); i++) { //박스를 반복하며 탐색
if (index == v1.size()) { //크레인을 다 순회하여 박스를 담을 수 없는 경우
break; //탈출
}
if (v1[index] >= v2[i]) { //크레인이 들 수 있는 무게를 확인
index++; //크레인의 순서를 증가
v2.erase(v2.begin() + i); //크레인으로 옮긴 상자를 삭제
i = i - 1; //사라진 자리로 다음 상자가 이동하니까 인덱스를 하나 줄여야 탐색시 걸러낼 수 있다.
}
}
cnt++; //옮긴 시간
}
cout << cnt;
}
}