/* 문제 : [2875] 대회 or 인턴
[input]
6 3 2
[output]
2
[설명]
백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다.
(왜인지는 총장님께 여쭈어보는 것이 좋겠다.)
백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.
그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다.
인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.
백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.
여러분은 N명의 여학생과 M명의 남학생, 인턴쉽에 참여해야하는 인원 K명이 주어질 때
만들 수 있는 최대의 팀 수를 구하면 된다.
*/
#include <iostream>
using namespace std;
int main()
{
int N, M, K; // 여학생, 남학생, 인턴쉽 참여해야하는 인원
int count = 0; // 만들 수 있는 팀의 수
cin >> N >> M >> K;
while ((N >= 2) && (M >= 1)) { // 더 이상 팀을 만들 수 없을때까지 팀의 수 증가
N -= 2;
M--;
count++;
}
for (K -= (N + M); K > 0; count--) { // 인턴쉽 참여해야하는 인원에 대한 팀의 수 감소
K -= 3;
}
cout << count;
return 0;
}
/* 문제 : [10610] 30
[input]
(case 1) 30
(case 2) 102
(case 3) 2931
[output]
(case 1) 30
(case 2) 210
(case 3) -1
[설명]
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다.
미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어
30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
N을 입력받는데 N는 최대 10^5개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라.
그 수가 존재하지 않는다면, -1을 출력
0이 있는지 확인해야 하며,
0을 제외한 나머지 숫자의 합이 3의 배수인지 확인해야 한다
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> num(10, 0);
string n; // // 미르코가 발견한 양수 N
int sum = 0;
cin >> n;
for (int i = 0; i < n.length(); i++) {
if (!((i == 0) && (n[i] == '0'))) {
num[n[i] - '0']++;
sum += n[i] - '0';
}
if (!n[i + 1])
break;
}
//// 발견한 숫자 중 0을 제외한 숫자가 3의 배수가 아니거나
//// 0이 없으면 30의 배수가 아니므로 -1 출력
if ((sum % 3 != 0) || (num[0] == 0)) {
cout << "-1";
return 0;
}
for (int i = 9; i >= 0; i--) {
for (int k = 0; k < num[i]; k++) {
cout << i;
}
}
return 0;
}
/* 문제 : [2217] 로프
[input]
2
10
15
[output]
20
[설명]
로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다
k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때,
각각의 로프에는 w/k 만큼의 중량이 걸리게 된다.
이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해라
모든 로프를 사용해야 할 필요는 없다. 단, 각각의 로프는 한 개씩만 존재한다.
*/
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int> rope;
int max = -1; // 최대 중량
int n; // 로프의 개수
cin >> n;
for (int i = 0, k; i < n; i++) {
cin >> k;
rope.insert(k);
}
multiset<int>::reverse_iterator ri = rope.rbegin();
int i = 1;
while (ri != rope.rend()) {
if (max < *ri * i) {
max = *ri * i;
}
ri++;
i++;
}
cout << max << endl;
return 0;
}
/* 문제 : [5585] 거스름돈
[input]
380
[output]
4
[설명]
지불할 돈(1~999)을 내고 1000엔 지폐를 한 장 내면 500, 100, 50, 10, 5, 1엔으로
가장 적게 잔돈을 주기 위한 동전의 개수를 출력해라.
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = { 500, 100, 50, 10, 5, 1 };
int money; // 거스름돈
int price; // 지불할 돈
int count = 0; // 동전 개수
cin >> price;
money = 1000 - price;
for (vector<int>::size_type i = 0; i < v.size(); i++) {
count += money / v[i];
money %= v[i];
if (money == 0) {
cout << count;
break;
}
}
return 0;
}
/* 문제 : [1931] 회의실배정
[input]
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
[output]
4
[설명]
첫째 줄에 회의의 수 N이 주어진다.
둘째 줄부터 회의 시작시간, 회의 끝나는 시간이 주어진다.
이 때, 최대 사용할 수 있는 회의 수를 출력해라.
*/
#include <iostream>
#include <queue>
using namespace std;
struct room {
int start;
int end;
room(int start, int end) :start(start), end(end) {};
};
bool operator < (room r1, room r2) {
if (r1.end != r2.end)
return r1.end > r2.end;
else
return r1.start > r2.start;
}
int main()
{
priority_queue<room> pQue;
int n; // 회의 수
int compareNum = -1; // 비교하는 변수
int count = 0;
cin >> n;
// 회의실 시작, 종료시간 입력
for (int i = 0, s, k; i < n; i++) {
cin >> s >> k;
pQue.push(room(s, k));
}
while (!pQue.empty()) {
room r = pQue.top();
pQue.pop();
if (compareNum <= r.start) {
compareNum = r.end;
count++;
}
}
cout << count;
return 0;
}
/* 문제 : [11047] 동전 0
[input]
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
[output]
6
[설명]
첫째 줄에 동전의 종류 N과 K원이 주어진다.
둘째 줄부터 동전의 가치가 오름차순으로 주어진다.
이 때, K원을 만드는데 필요한 동전 개수의 최소값 출력해라
*/
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> coinList; // 동전의 가치를 저장할 리스트
int n, k; // 동전의 종류, 만들어야 될 K원
int count = 0; // 필요한 동전의 개수
cin >> n >> k;
for (int i = 0, s; i < n; i++) {
cin >> s;
coinList.push_back(s);
}
coinList.reverse(); // 큰 것부터 나누기 위해 오름차순 정렬
list<int>::iterator iter = coinList.begin();
while (iter != coinList.end()) {
if (k >= *iter) {
count += k / *iter;
k %= *iter;
}
iter++;
}
cout << count;
return 0;
}