[c++] BOJ 1417번 :: κ΅­νšŒμ˜μ› μ„ κ±°

κ΅­νšŒμ˜μ› μ„ κ±°

문제

λ‹€μ†œμ΄λŠ” μ‚¬λžŒμ˜ λ§ˆμŒμ„ 읽을 수 μžˆλŠ” 기계λ₯Ό 가지고 μžˆλ‹€. λ‹€μ†œμ΄λŠ” 이 기계λ₯Ό μ΄μš©ν•΄μ„œ 2008λ…„ 4μ›” 9일 κ΅­νšŒμ˜μ› μ„ κ±°λ₯Ό μ‘°μž‘ν•˜λ €κ³  ν•œλ‹€.

λ‹€μ†œμ΄μ˜ κΈ°κ³„λŠ” 각 μ‚¬λžŒλ“€μ΄ λˆ„κ΅¬λ₯Ό 찍을 지 미리 읽을 수 μžˆλ‹€. μ–΄λ–€ μ‚¬λžŒμ΄ λˆ„κ΅¬λ₯Ό 찍을 지 μ •ν–ˆμœΌλ©΄, λ°˜λ“œμ‹œ μ„ κ±°λ•Œ κ·Έ μ‚¬λžŒμ„ μ°λŠ”λ‹€.

ν˜„μž¬ ν˜•νƒκ΅¬μ— λ‚˜μ˜¨ κ΅­νšŒμ˜μ› ν›„λ³΄λŠ” Nλͺ…이닀. λ‹€μ†œμ΄λŠ” 이 기계λ₯Ό μ΄μš©ν•΄μ„œ κ·Έ λ§ˆμ„μ˜ μ£Όλ―Ό Mλͺ…μ˜ λ§ˆμŒμ„ λͺ¨λ‘ μ½μ—ˆλ‹€.

λ‹€μ†œμ΄λŠ” 기호 1λ²ˆμ΄λ‹€. λ‹€μ†œμ΄λŠ” μ‚¬λžŒλ“€μ˜ λ§ˆμŒμ„ μ½μ–΄μ„œ μžμ‹ μ„ 찍지 μ•ŠμœΌλ €λŠ” μ‚¬λžŒμ„ 돈으둜 λ§€μˆ˜ν•΄μ„œ κ΅­νšŒμ˜μ›μ— 당선이 되게 ν•˜λ €κ³  ν•œλ‹€. λ‹€λ₯Έ λͺ¨λ“  μ‚¬λžŒμ˜ λ“ν‘œμˆ˜ 보닀 λ§Žμ€ λ“ν‘œμˆ˜λ₯Ό κ°€μ§ˆ λ•Œ, κ·Έ μ‚¬λžŒμ΄ κ΅­νšŒμ˜μ›μ— λ‹Ήμ„ λœλ‹€.

예λ₯Ό λ“€μ–΄μ„œ, λ§ˆμŒμ„ 읽은 κ²°κ³Ό 기호 1번이 5ν‘œ, 기호 2번이 7ν‘œ, 기호 3번이 7ν‘œ 라고 ν•œλ‹€λ©΄, λ‹€μ†œμ΄λŠ” 2번 후보λ₯Ό 찍으렀고 ν•˜λ˜ μ‚¬λžŒ 1λͺ…κ³Ό, 3번 후보λ₯Ό 찍으렀고 ν•˜λ˜ μ‚¬λžŒ 1λͺ…을 돈으둜 λ§€μˆ˜ν•˜λ©΄, κ΅­νšŒμ˜μ›μ— 당선이 λœλ‹€.

돈으둜 λ§€μˆ˜ν•œ μ‚¬λžŒμ€ λ°˜λ“œμ‹œ λ‹€μ†œμ΄λ₯Ό μ°λŠ”λ‹€κ³  κ°€μ •ν•œλ‹€.

λ‹€μ†œμ΄κ°€ λ§€μˆ˜ν•΄μ•Όν•˜λŠ” μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 ν›„λ³΄μ˜ 수 N이 주어진닀. λ‘˜μ§Έ 쀄뢀터 μ°¨λ‘€λŒ€λ‘œ 기호 1λ²ˆμ„ 찍으렀고 ν•˜λŠ” μ‚¬λžŒμ˜ 수, 기호 2λ²ˆμ„ 찍으렀고 ν•˜λŠ” 수, μ΄λ ‡κ²Œ 총 N개의 쀄에 걸쳐 μž…λ ₯이 λ“€μ–΄μ˜¨λ‹€. N은 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , λ“ν‘œμˆ˜λŠ” 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 λ‹€μ†œμ΄κ°€ λ§€μˆ˜ν•΄μ•Ό ν•˜λŠ” μ‚¬λžŒμ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜

[브루트 포슀](https://www.acmicpc.net/problem/tag/브루트 포슀)

λ‚˜μ˜ λ‹΅

μƒκ°μ˜ 흐름
  1. ν•˜λ‚˜μ”© μ€„μ—¬λ³΄μž

    μ‹œκ°„λ³΅μž‘λ„ 상 κ°€λŠ₯ν•  것 κ°™μ§€λ§Œ λ‹€λ₯Έ 방법을 ν•œ 번 μ°Ύμ•„λ³΄μ•˜λ‹€.

  2. (κ°€μž₯ 큰 수 - λ‹€μ†œμ΄ μ‚¬λžŒ / 2) λ°˜λ³΅ν•˜κΈ°

    λ°˜λ‘€κ°€ λ‚˜μ™€μ„œ μ‹€νŒ¨

μ½”λ“œ

brute force

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int N;
vector<int> num_arr;
int dasom;

int howManyPeople() {
    //O(n*n)
    /* λ‹΅ κ΅¬ν•˜κΈ° */
    if (num_arr.size() == 0) {
        return 0;
    }

    int answer = 0;
    int tmp;
    while (num_arr.size() != 0) {
        sort(num_arr.begin(), num_arr.end());
        if (num_arr[num_arr.size() - 1] < dasom) // 제일 큰 μˆ˜λ³΄λ‹€ dasom이 크면
            break;
        num_arr[num_arr.size() - 1]--; dasom++; answer++;
        int size = num_arr.size();
        for (int i = size - 1; i >= 0; i--) {
            if (num_arr[i]<dasom)
                num_arr.erase(num_arr.begin() + i);
        }
    }

    return answer;
}

int main() {
    cin >> N;
    cin >> dasom;

    for (int i = 0; i < N - 1; i++) {
        int tmp;
        cin >> tmp;
        if (dasom <= tmp)
            num_arr.push_back(tmp);
    }

    cout << howManyPeople();


}

쀑간에 sort도 직접 κ΅¬ν˜„ν•˜κ³ , STL의 μ—¬λŸ¬κ°€μ§€ μ»¨ν…Œμ΄λ„ˆ multiset, set 등을 μ΄μš©ν•΄λ³΄κΈ°λ„ ν•˜μ˜€μœΌλ‚˜ κ²°κ΅­ κ°€μž₯ 기본적인 λ°©λ²•μœΌλ‘œ λŒμ•„μ™”λ‹€.

계속 λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜μ„œ μ˜μ•„ν–ˆλŠ”λ°, κ°„λ‹¨ν•œ μ½”λ“œλΌμ„œ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ 것이 λ¬Έμ œμ˜€λ‹€. ν•¨μˆ˜κ°€ μ—†μœΌλ‹ˆ λ‹€μ†œμ΄λ₯Ό μ§€μ§€ν•˜λŠ” μ‚¬λžŒμ΄ κ°€μž₯ λ§Žμ„ λ•Œ return 1;을 ν–ˆλ”λ‹ˆ main ν•¨μˆ˜μ—μ„œ λŸ°νƒ€μž„μ—λŸ¬ μ²˜λ¦¬ν•΄μ„œ 계속 λŸ°νƒ€μž„μ—λŸ¬κ°€ λ‚˜λŠ” κ²ƒμ΄μ—ˆλ‹€. ν›„... λ‹€μŒμ—λŠ” μ‘°μ‹¬ν•˜κ³  μ‚½μ§ˆν•˜μ§€ 말자 ^γ… ^

λ‹€λ₯Έ λ‹΅

μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν•œ 풀이방법을 λ΄€λŠ”λ°, ꡉμž₯히 νŽΈν•΄λ³΄μΈλ‹€! 정렬을 μžλ™μœΌλ‘œ ν•΄μ£ΌλŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄μš©ν•˜λŠ” 것이 쒋을 것 κ°™λ‹€.

λ°˜μ‘ν˜•