このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のデータセット選択メニューから「英小文字の出現率 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
長さ Nの文字列 S が与えられます。 S に含まれている各文字の出現回数をそれぞれ求め、「 a」の出現回数、「 b」の出現回数、…、「 z」の出現回数を順に半角スペース区切りで出力してください。
期待する出力
「 a」の出現回数、「 b」の出現回数、…、「 z」の出現回数をそれぞれ出力してください。
1 |
A1 ... A_26 |
条件
すべてのテストケースにおいて、以下の条件をみたします。
- N は 1 以上 100 以下
- S の各文字は英小文字
考え方
執筆中
Swfit の場合、C 言語のような単純な操作で文字コードを得ることはできません。
C 言語であれば、文字コードを得たい文字をシングルクオートで囲むだけで文字コードを得られましたが、Swift には同様な操作はありません。
一方、Swift には Unicode.Scalar 型があり、そのプロパティの valueを使うことにより文字コードを得ることが可能となります。
- Unicode.Scalar
A Unicode scalar value.
Swift の場合には型が厳密なため何度か型変換を行う必要がありますが、ある文字の文字コードは
1 2 |
// 結果は UInt32 Unicode.Scalar(String($0))!.value |
という形で得ることが可能となりましす(今回の場合には、 Unicode.Scalar のイニシャライザは成功するという仮定のもと、強制アンラップを行っています)。
もし、この結果を配列のインデックス(要素数)として利用するのであれば、再度 Int に変換する必要がありますので注意してください。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 出現回数をカウントする配列 var counts = Array(repeating: 0, count: 26) // 先頭行は読み飛ばす _ = readLine() // 1. 1行読み込み // 2-1. 読込んだ文字を Unicode.Scalar 型に変換して文字コードを取得 // 2-2. その文字コードから小文字の "a" の文字コードを引く // 3. 出現文字に相当する配列の要素に1を足す readLine()!.map{ Int(Unicode.Scalar(String($0))!.value - Unicode.Scalar("a").value) } .forEach { counts[$0] += 1 } // 出力結果を整形する let out = counts.map { String($0) } .joined(separator: " ") // 結果出力 print(out) |
リファレンス
- value
A numeric representation of the Unicode scalar.