그리디 문제풀이

최성현·2021년 2월 6일
0

코딩테스트 준비

목록 보기
5/5

😊 모험가길드

#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를 이용한 탐색
=> 다시 공부

profile
후회없이

0개의 댓글