このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「パスワード作成 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
K さんは paiza のアカウントを作成することにしました。そのためには、パスワードの設定が必要なことがわかりました。
そこで K さんは忘れないように、次のようなルールにのっとって N 文字のパスワードを設定することにしました。
- ルール
K さんは N 文字のうち、 Q 文字だけ覚えておく文字を決めておく。
具体的には n_i 文字目を c_i とだけ決めて、残りの全ての文字を C にする。
K さんの設定したパスワードを当ててください。
- 例
N = 5 , Q = 1 , n_1 = 2 , c_1 = ‘T’ , C = ‘K’ のとき
パスワードは 5 文字であり、 2 文字目が ‘T’ , それ以外の文字を ‘K’ としたものである “KTKKK” が K さんのパスワードとなる。
入力される値
1 2 3 4 5 6 |
N Q n_1 c_1 ... n_Q c_Q C |
- 1 行目では、パスワードの文字数 N が与えられます。
- 2 行目では、K さんの覚えておく文字数 Q が与えられます。
- 続く Q 行では、何文字目を覚えておくかを表す n_i と覚えておく文字 c_i が与えられます。
- 最後の行では、パスワードの残りの部分を埋めるための文字 C が与えられます。
期待する出力
K さんのパスワードを 1 行で出力してください。
考え方
執筆中。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// とりあえず全ての入力を取り込む let sa = Array(AnyIterator { readLine() }).map{ String($0) } // パスワードの文字数(N) let n = Int(sa[0])! // 記憶しておく文字数(Q) let q = Int(sa[1])! // 置き換える文字(K) let k = sa.last! // 記憶しておく添字とそれに対応する文字を入れておく辞書 var password:[Int:String] = [:] // まずは、記憶しておく文字とそのインデックスを登録する for i in 0..<q { // sa[2] から sa[2 + q] までが記憶しておく文字と対応するインデックス // 空白で分解する let ns = sa[2 + i].split(separator: " ") // インデックス(Int) と文字列(String)にする let index = Int(ns[0])! let word = String(ns[1]) // 辞書として登録する password[index] = word } // N 文字分繰り返す(インデックスを作る) for i in 0..<n { // もし、指定したインデックスに文字が登録してあれば、それを出力 // 登録されていない場合は、K で指定された文字列を出力 if let w = password[i + 1] { print(w, terminator: "") } else { print(k, terminator: "") } } // 末尾の改行 print() |