Official

B - Legendary Players Editorial by MMNMM


初心者の方へ

  • AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
  • また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
  • C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。

この問題は、入力がそれぞれのユーザーネームのどれに等しいかを判定し、対応するレーティングを出力することで解くことができます(実は、それぞれのユーザーネームは先頭の文字を見るだけで区別することもできます)。

例えば、次のような実装方針で解くことができます。

  • 条件分岐を用いる方法
    • 実装例:C++, Haskell
  • 連想配列を用いる方法
    • 実装例:Python
  • 文字列置換を用いる方法
    • 実装例:sed

1. 条件分岐を用いる方法

ユーザーネームを \(1\) つずつ確認し、一致していたら対応するレーティングを出力することでこの問題を解くことができます。

実装例は以下のようになります。

C++

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s;
    cin >> s;
    
    if (s == "tourist")
        cout << 3858 << endl;
    if (s == "ksun48")
        cout << 3679 << endl;
    if (s == "Benq")
        cout << 3658 << endl;
    if (s == "Um_nik")
        cout << 3648 << endl;
    if (s == "apiad")
        cout << 3638 << endl;
    if (s == "Stonefeang")
        cout << 3630 << endl;
    if (s == "ecnerwala")
        cout << 3613 << endl;
    if (s == "mnbvmar")
        cout << 3555 << endl;
    if (s == "newbiedmy")
        cout << 3516 << endl;
    if (s == "semiexp")
        cout << 3481 << endl;
    
    return 0;
}

Haskell

main = interact (\s -> case s of
    "tourist" -> "3858"
    "ksun48" -> "3679"
    "Benq" -> "3658"
    "Um_nik" -> "3648"
    "apiad" -> "3638"
    "Stonefeang" -> "3630"
    "ecnerwala" -> "3613"
    "mnbvmar" -> "3555"
    "newbiedmy" -> "3516"
    "semiexp" -> "3481")

2. 連想配列を用いる方法

言語によっては、文字列などから対応する値を高速に取得する方法があります。C++ では std::map を、Python では dict を用いることができます。
これを用いて、ユーザーネームとレーティングを対応させることでこの問題を解くことができます。

実装例は以下のようになります。

username_to_rating = {
    "tourist": "3858", 
    "ksun48": "3679", 
    "Benq": "3658", 
    "Um_nik": "3648", 
    "apiad": "3638", 
    "Stonefeang": "3630", 
    "ecnerwala": "3613", 
    "mnbvmar": "3555", 
    "newbiedmy": "3516", 
    "semiexp": "3481"
}

print(username_to_rating[input()])

また、与えられた文字列を分割し、辞書内包表記などを用いて連想配列を作ることでも解くことができます。

data = """tourist 3858
ksun48 3679
Benq 3658
Um_nik 3648
apiad 3638
Stonefeang 3630
ecnerwala 3613
mnbvmar 3555
newbiedmy 3516
semiexp 3481"""

username_to_rating = {name: rating for name, rating in map(lambda s: s.split(), data.splitlines())}

print(username_to_rating[input()])

3. 文字列置換を用いる方法

入力に対して、ユーザーネームを対応するレーティングに置換することでこの問題を解くことができます。

実装例は以下のようになります。

sed

s/tourist/3858/
s/ksun48/3679/
s/Benq/3658/
s/Um_nik/3648/
s/apiad/3638/
s/Stonefeang/3630/
s/ecnerwala/3613/
s/mnbvmar/3555/
s/newbiedmy/3516/
s/semiexp/3481/

posted:
last update: