このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のデータセット選択メニューから「集合の探索 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
N 個の要素からなる数列 Aと数値 Bが与えられます。 B が A に含まれているか判定してください。入力される値
1 2 |
N B A1 A2 ... A_N |
- 入力値最終行の末尾に改行が1つ入ります。
- 文字列は標準入力から渡されます。
期待する出力
B が A に含まれている場合は「 Yes」を、そうではない場合は「 No」を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。
考え方
Swift の String は Collection プロトコルに準拠しているため、 contains(_:) メソッドを使って特定の要素が含まれているかどうかを調べることが可能です。
問題の趣旨としては、「数値の集合に B が含まれているか否か」を問うていますが、プログラム的には "A1 A2 ... A_N" という空白を含んだ数字の文字列の中に B に相当する文字があるか否かで判断することが可能です。
この場合、 contains(_:) が String.Element 型を扱えるようにするために、標準ライブラリに加え Foundation をインポートしなければならない点に注意してください。
もちろん、問題の趣旨通り、空白区切りで与えられた数字の文字列を数字の配列にして、その中に B に相当する数字があるか否かを判断することも可能です。配列( Array)も Collection に準拠していますので、 contains(_:) を使用可能です。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// contains が String.Element を受け取れるようにする import Foundation // 行頭から、B に相当するデータのみ読み込む let b = readLine()! .split(separator: " ") .map{ String($0) } .last! // 数列を読み込む let s = readLine()! // 数列中に B に相当する数値があれば Yes と出力 if s.contains(b) { print("Yes") } else { print("No") } |
問題の趣旨通りに解くのであれば次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 行頭から、B に相当するデータのみ読み込む let b = readLine()! .split(separator: " ") .map{ Int($0) } .last! // 1. 数列を読み込み // 2. 空白で区切る // 3. 数値の配列とする let s = readLine()! .split(separator: " ") .map { Int($0) } // 数列中に B に相当する数値があれば Yes と出力 if s.contains(b) { print("Yes") } else { print("No") } |