このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の戦セットから「【競技8】お一人様一点限り (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
この問題は、弊社営業社員が競技プログラミングに挑戦したものです。
あるスーパーでは、お一人様一点限りでセール価格の商品を販売することにしました。
そこで、一人のお客さんが2回以上その商品を買えないように、お客さんの名前をチェックすることにしました。
お客さんの名前が来た順番で入力されるので、そのお客さんが初めて来たのかどうかを判定し、結果を出力してください。
入力される値
入力は以下のフォーマットで与えられます
1 2 3 4 5 |
n c_1 c_2 ... c_n |
- 入力される文字列数n
- c_1, c_2, …, c_n は大文字、小文字のアルファベットからなる文字列
- 入力はn + 1行となり、末尾に改行を一つ含みます。
期待する出力
- 初めて来たお客さんには YES
- 一度来たお客さんには NO
を出力してください。ただし、同じ名前のお客さんはいないものとします。
考え方
客の名前は String で与えられるため、 String つまり客の名前をキーとした Dictionary で来店情報を作ることにする。
配列に保存した客の名前をキーとして Dictionary からデータを引っ張ってくるが、キーが未登録の場合、Swift の Dictionary は nil を返すため、それをオプショナルバインディングを使って判断し、 "YES" ないし "NO" を出力する。
初めての客の場合には、客の名前に相当するキーに 1 を代入することで、既に来店した客であることを記録する。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 |
_ = readLine()! let sa = Array(AnyIterator { readLine() }) var c = [String: Int]() for s in sa { if let _ = c[s] { print("NO") } else { print("YES") c[s] = 1 } } |