このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の配列活用メニューから「【配列に対しての複雑な処理】集団行動 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
あなたは集団行動のリーダーです。次のような指示を出すことで様々な列の操作ができます。
- swap A B
先頭から A 番目の人と、先頭から B 番目の人の位置を入れ替える。 - reverse
列の前後を入れ替える。 - resize C
先頭から C 人を列に残し、それ以外の人を全員列から離れさせる。ただし、列が既に C 人以下の場合、何も行わない。
初め、列には番号 1 〜 N の N 人がおり、先頭から番号の昇順に並んでいます。(1, 2 , 3, …, N)
あなたの出した指示の回数 Q とその指示の内容 S_i (1 ≦ i ≦ Q) が順に与えられるので、全ての操作を順に行った後の列を出力してください。
入力される値
1 2 3 4 |
N Q S_1 ... S_Q |
- 1 行目では、初めの列の人数 N と、指示の回数 Q が半角スペース区切りで与えられます。
- 以降の N 行では指示の内容を表す S_i (1 ≦ i ≦ N) が与えられます。
期待する出力
1 2 3 |
S_1 ... ... |
- 全ての操作を終えた後の列 S の生徒番号を先頭から順に改行区切りで出力してください。
- また、出力の末尾には改行を入れてください。
考え方
執筆中
解答例
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 ia = readLine()!.split(separator: " ").map { Int($0)! } // 初期の要素数 N と命令数 Q を読み込む let n = ia[0] let q = ia[1] // 実際は不要 // 初期配列を作る var l = [Int](1...n) // 1. 行末まで読み込み // 2. 二次元配列に変換し // 3. 条件に分けて処理する // 3-1. "swap" の場合は A, Bで指定された要素を入れ替える // 3-2. "reverse" の場合は行列を反転させる // 3-3. "resize" の場合は先頭 C 分だけ取り出す Array(AnyIterator { readLine() }) .map { $0.split(separator: " ") .map { String($0) } } .forEach { s in switch s[0] { case "swap": let a = Int(s[1])! - 1 let b = Int(s[2])! - 1 l.swapAt(a, b) case "reverse": l.reverse() case "resize": // prefix の結果は Slice なので Array に変換する l = Array(l.prefix(Int(s[1])!)) default: break } } // 結果出力 l.forEach { print($0) } |