#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int result = 0; // 총 그룹의 수
int count = 0; // 현재 그룹에 포함된 모험가의 수
for (int i = 0; i < n; i++) { // 공포도를 낮은 것부터 하나씩 확인하며
count += 1; // 현재 그룹에 해당 모험가를 포함시키기
if (count >= arr[i]) { // 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1; // 총 그룹의 수 증가시키기
count = 0; // 현재 그룹에 포함된 모험가의 수 초기화
}
}
cout << result << '\n'; // 총 그룹의 수 출력
}
#include <bits/stdc++.h>
using namespace std;
string str;
int main(void) {
cin >> str;
// 첫 번째 문자를 숫자로 변경한 값을 대입
long long result = str[0] - '0';
for (int i = 1; i < str.size(); i++) {
// 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
int num = str[i] - '0';
if (num <= 1 || result <= 1) {
result += num;
}
else {
result *= num;
}
}
cout << result << '\n';
}
#include <bits/stdc++.h>
using namespace std;
string str;
int count0 = 0; // 전부 0으로 바꾸는 경우
int count1 = 0; // 전부 1로 바꾸는 경우
int main(void) {
cin >> str;
// 첫 번째 원소에 대해서 처리
if (str[0] == '1') {
count0 += 1;
}
else {
count1 += 1;
}
// 두 번째 원소부터 모든 원소를 확인하며
for (int i = 0; i < str.size() - 1; i++) {
if (str[i] != str[i + 1]) {
// 다음 수에서 1로 바뀌는 경우
if (str[i + 1] == '1') count0 += 1;
// 다음 수에서 0으로 바뀌는 경우
else count1 += 1;
}
}
cout << min(count0, count1) << '\n';
}
예를 들어 , 1,2,3,5 원 단위를 가지고있다고한다면 우선 1,2,3원을 통해
1 = 1
2 = 2
3 = 3
4 = 1+3
5 = 2+3
6 = 1+2+3
즉 1+2+3=6원까지 모두 만들 수 있다.
여기서 5원단위가 들어오게된다면
1+5 , 2+5 , 3+5, ... , (블록문제와 유사) 1+2+3+5=11원까지 만들 수 있다.
하지만 1,2,3,8원의 단위 동전이 있다면
1+2+3=6 이후 7원을 만들수없다. 즉 target을 계속 증가(단위 기준), 하다가 가지고있는 단위보다 더 작게된다면 최적의 해를 구할 수 있다.
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int target = 1;
for (int i = 0; i < n; i++) {
// 만들 수 없는 금액을 찾았을 때 반복 종료
if (target < arr[i]) break;
target += arr[i];
}
// 만들 수 없는 금액 출력
cout << target << '\n';
}
A,B 두사람이 있을때, A를 기준으로 case를 나눈다.
무게가 1인 볼링공 1개, 무게 2인 볼링공 2개, 무게 3인 볼링공 2 개가 있다고하면
(조합 combination 경우의수 를 생각)
case 1) A가 무게 1인 공을 선택할경우 ->
(A가 고를 무게1의 가짓수) 1 * 4(B가 나머지 무게 고를 경우)
case 2) A가 무게 2인 공을 선택할 경우 ->
(A가 고를 무게2의 가짓수) 2 2(B가 나머지 무게 고를경우)
여기서, 2 3이 아닌 이유는 조합으로 인해 이미 계산했던 무게1을 고를때를 제외한 경우의수이다.
case3 )
2 * 0 = 0 가지
총 8가지이다.
#include <bits/stdc++.h>
using namespace std;
int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x] += 1;
}
int result = 0;
// 1부터 m까지의 각 무게에 대하여 처리
for (int i = 1; i <= m; i++) {
n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
}
cout << result << '\n';
}
priority_queue를 이용한 탐색
=> 다시 공부