C++で質問文の最後の文字が母音かどうかを判定して答えを導くコード
問題の概要
文字列 S が与えられ、Amal と Bimal があるゲームを行います。ゲームのルールは次のとおりです。先にプレイする Amal は探偵役となり、「事件」を調査して原因を突き止める必要があります。彼は答えが「Yes」か「No」のどちらかになる質問を自由に行うことができます。そして、質問文の最後の文字が母音であれば「Yes」、そうでなければ「No」と回答します。ここで扱う母音は A、E、I、O、U、Y の6種類です。文字列 S を質問として受け取り、その答えを求めるのがこの問題の目的です。
例えば、入力が S = "Is it in university?" の場合、出力は「Yes」になります。これは、疑問符の直前にある文字が y(母音の一つ)であるためです。
解決の手順
この問題を解くには、以下の手順に従います。
- 母音をすべて含む文字列 s := "AEIOUYaeiouy" を用意します。
- 文字列 S を先頭から順に走査し、英字が現れるたびに変数 ans を更新します。これにより、ループ終了時には S 内で最後に出現した英字が ans に残ります。
- ans が s に含まれていれば「YES」を返し、含まれていなければ「NO」を返します。
これを擬似コードで表すと次のようになります。
s := "AEIOUYaeiouy"
for initialize i := 0, when i < size of S, update (increase i by 1), do:
t := S[i]
if t is alphabetic, then:
ans := t
if ans is in s, then:
return "YES"
Otherwise
return "NO"実装例
理解を深めるために、実際のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
string solve(string S){
string s = "AEIOUYaeiouy";
char ans;
for (int i = 0; i < S.size(); i++){
char t = S[i];
if (isalpha(t))
ans = t;
}
if (s.find(ans) != -1)
return "YES";
else
return "NO";
}
int main(){
string S = "Is it in university?";
cout << solve(S) << endl;
}入力
"Is it in university?"
出力
YES
ポイントの解説
このコードの重要な点は、文字列を前から順に調べながら、英字が出てくるたびに ans を上書きしているところです。これにより、句読点や空白、疑問符などを自動的に無視し、質問文の実質的な最後の英字だけを判定対象にできます。また、この問題では通常の母音5文字に加えて Y も母音として扱っている点に注意してください。大文字・小文字の両方をあらかじめ文字列 s に含めておくことで、大小文字の違いを意識せずにシンプルな判定処理を実現しています。
-
【C++】'D'と'I'の署名から辞書順最小の順列を見つけるアルゴリズム
問題概要D と I の2種類の文字だけで構成された「秘密の署名」を考えます。D は隣接する2つの数の間の減少関係を、I は増加関係を表します。この署名は、1 から n までの相異なる整数をすべて含む特別な整数配列から構成されます。たとえば、署名 DI は [2, 1, 3] や [3, 1, 2] のような配列から構成できます。一方、[3, 2, 4] や [2, 1, 3, 4] のような配列では構成できず、不正な構成となります。ここでの課題は、入力として与えられた署名に一致する [1, 2, ..., n] の順列のうち、辞書順で最小のものを見つけることです。入力が DI の場合、出力は
-
C++で入力された文字が母音か子音かを判定する方法
このチュートリアルでは、C++を使って「ある文字が母音なのか、それとも子音なのか」を判定するプログラムの作り方を解説します。 英語における母音は a、e、i、o、u の5つです。プログラムでは、与えられた1文字がこれらのいずれかに該当する場合は「母音(Vowel)」と出力し、それ以外の場合は「子音(Consonant)」と出力します。 実装例 以下のコードでは、判定処理を関数 is_vowel() として切り出し、引数で受け取った文字を比較することで母音かどうかをチェックしています。 #include <iostream> using namespace std; // 文字が母