公式

B - Decode Time Signal 解説 by MtSaka


この問題では \(0\) 以上 \(9\) 以下の数字に対応するモールス符号を保持し、各文字列についてその対応を参照して復号することで答えを求めることができます。

この数字とモールス符号の対応は問題文や入力例 \(2\) をコピーすることで簡単に保持できます。

また、モールス符号と数字の対応の特徴を利用した解法もあります。 符号化した文字列を \(S\) としたとき、\(S\) の中にある . の数を \(K\) とすると、 \(S\)\(5\) 文字目が . である時に対応する数字は \(10-K\) 、そうでない時には \(K\) となっています。この特徴を用いて各文字列を復号することもできます。

実装例1 (C++):

#include <bits/stdc++.h>
using namespace std;

const vector<string> morse = {
    "-----",
    ".----",
    "..---",
    "...--",
    "....-",
    ".....",
    "-....",
    "--...",
    "---..",
    "----.",
};
int main() {
    int n;
    cin >> n;
    string ans = "";
    for (int i = 0; i < n; ++i) {
        string s;
        cin >> s;
        ans += '0' + (find(morse.begin(), morse.end(), s) - morse.begin());
    }
    cout << ans << endl;
}

実装例2 (C++):

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    string ans = "";
    for (int i = 0; i < n; ++i) {
        string s;
        cin >> s;
        ans += '0' + (s[4] == '.' ? 10 - count(s.begin(), s.end(), '.') : count(s.begin(), s.end(), '.'));
    }
    cout << ans << endl;
}

実装例1 (Python):

morse = [
    "-----",
    ".----",
    "..---",
    "...--",
    "....-",
    ".....",
    "-....",
    "--...",
    "---..",
    "----."
]

n = int(input())
ans = ""
for _ in range(n):
    s = input()
    ans += str(morse.index(s))
print(ans)

実装例2 (Python):

n = int(input())
ans = ""
for _ in range(n):
    s = input()
    if s[4] == '.':
        ans += str(10 - s.count('.'))
    else:
        ans += str(s.count('.'))
print(ans)

投稿日時:
最終更新: