恋するハッカソン解答例と解説・ゆかた(C++)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

恋するハッカソン解答例と解説・制服(C++)からかなりの期間が経ったが、今回は「ゆかた」のお題にチャレンジしてみたい。

お題

今回のお題だが、一定の法則に従って、電気代の概算をするというもので、以下の法則に従って、0時から24時までの電気代の概算をするというものである。

  • 温度が1度以上の場合、1時間かけて1度下げる冷却を行う為、1時間あたり2円かかる
  • 温度が0度の場合、保温を行う為、1時間あたり1円かかる
  • ものを入れた場合、5度上昇する
  • ものを出した場合、3度上昇する

サンプルコード

cf: https://github.com/saitomarch/POH8/blob/master/cpp/yukata.cpp

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <map>

using namespace std;

string readline()
{
    string str;
    getline(cin, str);
    return str;
}

vector<string> split(const string &str, char sep)
{
    vector<string> vec;
    istringstream sstream(str);
    string buf;
    while (getline(sstream, buf, sep)) {
        vec.push_back(buf);
    }
    return vec;
}

int main(void){
    auto times = stoi(readline());
    map<int, string> actMap;

    for (auto cnt = 0; cnt < times; cnt++) {
        auto arr = split(readline(), ' ');
        actMap[stoi(arr[0])] = arr[1];
    }

    auto hours = 24;
    auto temp = 0;
    auto cost = 0;

    for (auto hour = 0; hour <= hours; hour++) {
        if (hour > 0) {
            if (temp > 0) {
                temp--;
                cost += 2;
            }else{
                cost += 1;
            }
        }
        if (!actMap[hour].empty()) {
            if (actMap[hour] == "in") {
                temp += 5;
            }else if(actMap[hour] == "out") {
                temp += 3;
            }
        }
    }
    cout << cost << endl;

    return 0;
}

解説

今回は0時から24時までのforループで計算するという方法で行った。

最初に何時にものを入れるのか取り出すのかというマップを生成、のちにそれを元に温度と費用を1時間ごとに計算させるという方法をとった。

なお、時間と処理を扱う連想配列にはstd::mapを使った。この方法は処理コストはかかるものの、比較的わかりやすいとは言えるのかもしれない。

最後に

これで今回のpaizaオンラインハッカソンである程度の説明が必要と考えられるお題は以上のとおりである。機会があれば是非ともチャレンジしてみてはいかがだろうか?

タイトルとURLをコピーしました