C. Milk Measurement

- kir3i

λ¬Έμ œμ—μ„œ Farmer John은 ν—›κ°„ 벽에 κ°€μž₯ 우유λ₯Ό 많이 μƒμ‚°ν•˜λŠ” μ –μ†Œμ˜ 사진을 κ±Έμ–΄λ†“μŠ΅λ‹ˆλ‹€.

ꡬ해야할 것은 ν—›κ°„ 벽에 κ±Έλ €μžˆλŠ” μ –μ†Œμ˜ 사진이 λ°”λ€ŒλŠ” νšŸμˆ˜μž…λ‹ˆλ‹€.

λ§Œμ•½ μš°μœ μƒμ‚°λŸ‰μ΄ κ°€μž₯ λ§Žμ€ μ –μ†Œκ°€ 두 마리둜 μ„œλ‘œ 동점이면 사진을 두 μž₯ κ±Έμ–΄μ•Όν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 이 λ¬Έμ œλŠ” β€˜νŠΉμ • λ‚ μ§œμ— μ΅œλŒ€λ‘œ 우유λ₯Ό 생산 ν•˜λŠ” μ –μ†Œκ°€ λͺ‡ λ²ˆμ΄λ‚˜ λ°”λ€ŒλŠ”κ°€?’,

즉 μ΅œλŒ“κ°’μ˜ μœ„μΉ˜μ™€ κ°œμˆ˜κ°€ μ–Όλ§ˆλ‚˜ λ³€ν•˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” 문제라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

풀이 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μž…λ ₯받은 둜그λ₯Ό λ‚ μ§œκ°€ λΉ λ₯Έ 순으둜 μ •λ ¬ν•œλ‹€.

  2. 1일뢀터 100μΌκΉŒμ§€ μ§„ν–‰ν•˜λ©° 둜그 상에 μΌμΉ˜ν•˜λŠ” λ‚ μ§œκ°€ 있으면 우유 μƒμ‚°λŸ‰μ˜ λ³€ν™”λ₯Ό λ°˜μ˜ν•œλ‹€.

  3. ν•΄λ‹Ή μΌμžμ—μ„œ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜κ³  기쑴에 μ €μž₯ν•΄λ‘μ—ˆλ˜ status와 λ‹€λ₯΄λ©΄ statusλ₯Ό κ°±μ‹ ν•œλ‹€.

    -> ν•œ 번 count.

우유 μƒμ‚°λŸ‰ μ΅œλŒ“κ°’μ˜ μœ„μΉ˜, κ°œμˆ˜λŠ” λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν•˜μ—¬ λ‚˜νƒ€λƒˆμŠ΅λ‹ˆλ‹€.

<C++>

#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;

int measure[3] = {7, 7, 7};   //0 - Bessie, 1 - Elsie, 2 - Mildred
vector<pair<int, pair<int, int>>> cowlog;  // {day, {cow_num, d_milk}}

int find_max()
{
    int rtn = 0;
    int max_measure = max(measure[0], max(measure[1], measure[2]));

    for(int i=0; i<3; i++)
        if(measure[i] == max_measure)
            rtn |= 1<<i;
    return rtn;
}

int main(void)
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);

    int N;
    cin >> N;

    for(int i=0; i<N; i++)
    {
        int day, d_milk, cow_num;
        string cow_name;
        cin >> day >> cow_name >> d_milk;
        if(cow_name == "Bessie")
            cow_num = 0;
        else if(cow_name == "Elsie")
            cow_num = 1;
        else if(cow_name == "Mildred")
            cow_num = 2;
        cowlog.push_back(make_pair(day, make_pair(cow_num, d_milk)));
    }
    sort(cowlog.begin(), cowlog.end());


    //μ΄ˆκΈ°μ—λŠ” λͺ¨λ“  μ –μ†Œμ˜ μƒμ‚°λŸ‰μ΄ λ™μΌν•˜λ―€λ‘œ λͺ¨λ“  μ –μ†Œμ˜ 사진이 κ±Έλ €μžˆλ‹€.
    int status = 1<<2 | 1<<1 | 1<<0;
    int logidx = 0;
    int cnt = 0;
    for(int day=1; day<=100; day++)
    {
        for( ; logidx<N; logidx++)
        {
            if(cowlog[logidx].first == day)
                measure[cowlog[logidx].second.first] += cowlog[logidx].second.second;
            else
                break;
        }
        int t = find_max();
        //μ΅œλŒ“κ°’μ˜ μœ„μΉ˜λ‚˜ κ°œμˆ˜κ°€ 달라진 경우
        if(status != t)
        {
            status = t;
            cnt++;
        }
    }
    cout << cnt;
}

Last updated

Was this helpful?