반응형
문제링크:https://www.acmicpc.net/problem/1092
1092번: 배
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
그리디 문제입니다.
항상 최선의 선택을 할 때 결과값이 도출되기 때문입니다.
해당 문제는 n 배열과 m 배열을 내림차순으로 정렬하고 순서대로 큰 짐을 먼저 옮겨주면 되는 문제였습니다.
못 옮기는 기준은 가장 센 크레인 (arr_n[0])이 가장 무거운 짐(arr_m[0]) 보다 작을 때 입니다.
그리고 일반 배열에 O(n*m)로 구현하시면 시간초과입니다.
최악의 상황에 O(m*n*m) 이 되어 500,000,000로 5초가 걸리기 때문입니다.
정답코드입니다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int arr_n[51] = { 0 };
vector <int> arr_m;
int n = 0, m = 0, result = 0;
bool cmp(int a, int b) {
if (a > b)return true;
return false;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr_n[i];
cin >> m;
int num = 0;
for (int i = 0; i < m; i++) {
cin >> num;
arr_m.push_back(num);
}
sort(arr_n, arr_n + n, cmp);
sort(arr_m.begin(), arr_m.end(), cmp);
if (arr_n[0] < arr_m[0]) {
cout << -1 << endl;
return 0;
}
while (1) {
result++;
for (int i = 0; i < n; i++) {
for (int j = 0; j < arr_m.size(); j++) {
if (arr_n[i] >= arr_m[j]) {
arr_m.erase(arr_m.begin() + j);
break;
}
}
}
if (arr_m.size() == 0)
break;
}
cout << result << '\n';
}
저는 벡터를 사용해서 짐을 뺄때마다 erase로 값을 지워주도록 구현하였습니다.
반응형
'알고리즘 > 그리디 알고리즘' 카테고리의 다른 글
[백준] 1461-도서관(C++) (1) | 2021.05.22 |
---|---|
[백준] 1493-박스채우기(C++) (0) | 2020.05.19 |
[백준] 10825-국영수(C++) (0) | 2020.03.13 |
[백준] 8980-택배(C++) (0) | 2020.03.05 |
[백준] 1969-DNA(C++) (0) | 2020.03.03 |