このページについて

このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。

見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。

挑戦する課題

レベルアップ問題集Dランク早解きセットから「【早解16】アルファベットの穴の数 (paizaランク D 相当)」を取り上げます。

以下は、問題公開 Web ページからの引用です。

問題

大文字のアルファベットには、囲われた部分があるものと、そうでないものがあります。

例えば、

  • Aは上部の三角形の部分が囲われており、囲われた部分が1つ存在します。
  • Bは上部と下部がそれぞれ囲われており、囲われた部分が2つ存在します。
  • Cには囲われた部分は存在しません。

入力として、大文字のアルファベットが与えられるので、その文字にある囲われた部分の数を出力してください。

ただし、囲われた部分の数は以下であるとします。

  • 0個 : C, E, F, G, H, I, J, K, L, M, N, S, T, U, V, W, X, Y, Z
  • 1個 : A, D, O, P, Q, R
  • 2個 : B

入力される値

入力は以下のフォーマットで与えられます

  • s は大文字アルファベット1文字

期待する出力

入力されたアルファベットの囲われた部分の数を出力し、最後に改行して出力してください。

考え方

真面目に考えると、大文字のアルファベットに見つけることができる閉ループの数を数えればいいわけですが、そのようなことは簡単にできないので、あらかじめテーブルを作っておき、それと比較することにします。

マッチング用データを手打ちで作ると間違いの元なので、問題として与えられている文字列をコピーし、そこからアルファベットだけの文字列を作り(Swift の場合は isLetter プロパティと filter の組み合わせで生成)、その文字列に与えられた文字が含まれているかどうかを判別する方法を採用します。

あるいは、ごく初歩的な文法だけで解くのであれば、 switch 構文とパターンマッチを併用することになると思われます。

 解答例

contains() の引数が Character を取れるよう、 import Foundation を指定する。
 

もうちょっと別の書き方をすると

 

コード量を減らすことを考えると、穴が二つのパターンと "B" だけのパターン以外は穴が一つのパターンとなるので、

 

switch 構文をつかうのであれば、下記のような感じになります。
いずれの方法であっても、マッチングさせるデータを間違いなく適用させるには、問題文からデータをコピーすることを念頭に入れたほうが良いと思われます。