このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のスキルチェック過去問セットから「単語のカウント (paizaランク C 相当) 」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
スペースで区切られた英単語列が与えられます。
英単語列に含まれる英単語の出現回数を出現した順番に出力してください。
期待する出力
単語、半角スペース、出現回数の順で1行に1単語で出現したすべての単語を、列に出現する順に出力してください。
条件
全てのテストケースにおいて以下の条件を満たします。
- 1 ≦ N ≦ 1,000
考え方
執筆中。
動的に追加できる順序つき辞書があれば良いが、Swift5 の順序つき辞書(KeyValuePairs)は動的に値を追加できないため、代わりにタプルの配列を作り、それに逐次データとカウントを追加する。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 入力を受け取り、空白で区切り、配列にする let sa = readLine()!.split(separator: " ").map{ String($0) } // 出現順を記録するためのタプルの配列 var cnt: [(key:String, count:Int)] = [] for s in sa { // 既に登録済みの場合 if let index = cnt.firstIndex(where: { $0.key == s}) { // カウントを増やす cnt[index].count += 1 } else { // 新たにペアを追加する cnt.append((s, 1)) } } // 結果表示 for (key, value) in cnt{ print(key, value) } |