このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のデータセット選択メニューから「重複の判定 2 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
N 個の要素からなる数列 A が与えられます。 2 ≦ i ≦ Nの各 i に対して、 A_i と同じ値が、A_1
から
A_( i - 1 ) の間にあるか判定してください。ただし、
A_i は非常に大きくなることがあります。
入力される値
1 2 |
N A1 A2 ... A_N |
- 入力値最終行の末尾に改行が1つ入ります。
- 文字列は標準入力から渡されます。
期待する出力
N - 1 行で A_i と同じ値があるか判定した結果を出力してください。同じ値がある場合は "Yes"を、ない場合は "No"を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。
1 2 3 4 |
S_2 S_3 ... S_N |
考え方
既出の以下の問題と全く同じコードで解答可能。
そもそも、paiza の出題については、演算をしなくて良い数値は文字列として扱ったほうが便利なことが多い。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 既出の値を入れる集合を作る var val: Set<String> = [] // 最初の行は読み飛ばし _ = readLine() // 1. 1行読み込み // 2. 空白で分解し // 3. String.Element を String に変換し // 4. 各行ごとに処理 // 4-1. 集合が空の場合(つまり、初回)は処理しない // 4-2. 与えられた文字が既に集合にある場合には "Yes" を出力 // 4-3. 与えられた文字を集合に挿入 readLine()!.split(separator: " ") .map { String($0) } .forEach{ s in // 初回は判定しない if val.count > 0 { print(val.contains(s) ? "Yes" : "No") } val.insert(s) } |