このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の配列活用メニューから「場所取り (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
開店直後に店に入るために、番号 1 〜 N の N 人が開店前に店の前にブルーシートを合計 K 枚置きました。ブルーシートの先頭は A_1 , 最後尾は A_K です。しかし、店側は先頭から F 枚のブルーシートを撤去しました。
1 〜 N 番の人々は次のルールに従って店に並びます。
- 自分のブルーシートが 1 枚以上残っているとき、自分のブルーシートのうち、最も先頭に近いブルーシートの位置に並ぶ。
- 自分のブルーシートが 1 枚も残っていないとき、並ぶことなく帰宅する。
全員が並び終わった後に待機列にいる人の番号を先頭から順に答えてください。
入力される値
1 2 3 4 |
N K F A_1 ... A_K |
- 1 行目では、並びの人数 N とブルーシートの合計枚数 K と先頭から撤去されるブルーシートの枚数 F が半角スペース区切りで与えられます。
- 続く K 行では、ブルーシートの所有者の番号 A_i (1 ≦ i ≦ N) が先頭から順に与えられます。
入力例1
1 2 3 4 5 6 7 8 9 10 11 |
5 10 1 1 4 4 3 5 4 2 4 1 1 |
出力例1
1 2 3 4 5 |
4 3 5 2 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 |
import Foundation // 先頭行の条件を読み込みむ let ia = readLine()!.split(separator: " ").map { Int($0)! } // 必要なのは K のみ let k = ia[2] // 通過した人リスト var p: [Int] = [] // 1. 残りの行を一気に読み込み // 2. 先頭の k 行を切り落とし(撤去されたブルーシート) // 3. Int に変換し // 4. 通過リストに基づいて処理する // 4-1. 通過リストに名称が載っていなければ、表示した上にリストに追加 // 4-2. リストに載っていた場合はなにもしない Array(AnyIterator { readLine() }) .dropFirst(k) .map { Int($0)! } .forEach { n in if !p.contains(n) { print(n) p.append(n) } } |