🕌

ABC218 A - Weather Forecast / B - qwerty C++解答例

2021/09/12に公開

AtCoder Beginner Contest 218のA問題とB問題をC++で解きます。

A - Weather Forecast

問題文をAtCoderのページより引用します。

問題文

明日からの7日間の天気予報を表す文字列Sが与えられます。
i日後の予報はSi文字目がoであるとき晴れxであるとき雨です。

N日後の天気予報が晴れかどうかを教えてください。

制約

  • Nは1以上7以下の整数
  • Sは長さ7の文字列であり、oxのみからなる

解答例

与えられた文字列SN文字目を取得し、oxかを判定します。
文字列Sstd::string型変数に受け取ることで、Si文字目にS.at(i - 1)という文でアクセスできます。
インデックスの指定がi - 1になっているのはstd::stringが0-indexedだからです。Sの1文字目(最初の文字)はS.at(0)に格納されています。

a.cpp
#include <iostream>
#include <string>

int main() {
  int64_t N;
  std::string S;
  std::cin >> N >> S;

  if (S.at(N - 1) == 'o') {
    std::cout << "Yes" << std::endl;
  } else {
    std::cout << "No" << std::endl;
  }

  return 0;
}

実際に提出したコードはこちら

B - qwerty

問題文をAtCoderのページより引用します。

問題文

1以上26以下の整数からなる長さ26の数列P = (P_1, P_2, \ldots, P_{26})が与えられます。ここで、Pの要素は相異なることが保証されます。
以下の条件を満たす長さ26の文字列Sを出力してください。

  • 任意のi (1 \leq i \leq 26)について、Si文字目は辞書順で小さい方からP_i番目の英小文字である。

制約

  • 1 \leq P_i \leq 26
  • P_i \neq P_j (i \neq j)
  • 入力はすべて整数である。

解答例

「辞書順で小さい方からP_i番目の英小文字」は、アルファベット順にaから数えてP_i番目の文字に相当します。
例えばaから数えて2番目の英小文字はbです。

従って、与えられた数列Pの各要素に対して、「アルファベット順にaから数えてP_i番目の英小文字」を求め、それを順に出力していけば良いことになります。

任意のP_iについてアルファベット順にaから数えてP_i番目の英小文字を求める方法についてですが、小文字のアルファベットを順番に並べた文字列Aを準備しておく方法と、char型変数を使って直接求める方法の2通りがあります。
本記事では後者の方法を採用します。P_i番目の小文字アルファベットを求めるには、'a' + (P.at(i) - 1)という演算をすることで当該小文字のchar型変数が求まります。ここでも0-indexedなので注意が必要です。

以下のコードでは解答用の文字列Sを用意しておき、Pの各要素について答えを求めてSに結合させています。その後、Sの中身を出力しています。

b.cpp
#include <iostream>
#include <vector>
#include <string>

int main() {
  std::vector<int64_t> P(26);
  for (auto& p : P) {
    std::cin >> p;
  }

  std::vector<char> S(26);
  for (int64_t i = 0; i < 26; i++) {
    S.at(i) = 'a' + (P.at(i) - 1);
  }

  for (auto c : S) {
    std::cout << c;
  }
  std::cout << std::endl;


  return 0;
}

実際に提出したコードはこちら

Discussion