このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のデータセット選択メニューから「商品の検索 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
paiza 商店には N 個の商品が売られており、 i 番目の商品の名前は A_i で価格は B_i です。あなたはほしい M 個の商品名のリスト S を持っています。それぞれpaiza商店ではいくらで売られているか答えてください。売られていない場合は -1 を出力してください。
入力される値
1 2 3 4 5 6 7 8 9 |
N M A1 B1 A2 B2 ... A_N B_N S1 S2 ... S_M |
- 入力値最終行の末尾に改行が1つ入ります。
- 文字列は標準入力から渡されます。
期待する出力商品
S_i の値段 T_i を答えてください。paiza商店に商品 S_i が売られていない場合は - 1 を出力してください。
1 2 3 4 5 |
T1 T2 T3 ... T_M |
入力例1
1 2 3 4 5 6 7 8 |
3 4 eraser 50 pencil 30 book 100 book eraser pencil margaret |
出力例1
1 2 3 4 |
100 50 30 -1 |
考え方
この問題も直前の問題と同じく、辞書(Dictionary)を活用して解く問題となります。
はじめに、指定された N 行で入力されるアイテムリストから、商品名とその価格を辞書を作って作成します。
その後、続く
M 行で入力されるアイテムリストに従い、そのアイテムの価格を表示させます。もし該当する商品がなければ、
-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 |
// 商品の個数 N を得る(Mは不要) let n = readLine()! .split(separator: " ") .map { Int($0)! } .first! // paiza 商店のアイテムリスト var items: [String: String] = [:] // はじめの N 行分プライスリストを得る for _ in 0..<n { // item[0] が商品名 // item[1] が価格 let item = readLine()! .split(separator: " ") .map{ String($0) } items[item[0]] = item[1] } // 1. 残りの入力を行末まで読み込み // 2. String に変換し // 3. 各行処理する // 3-1. アイテムリストに登録されていれば、その価格を表示する // 3-2. 登録がない場合は -1 を出力する Array(AnyIterator { readLine() }) .map{ String($0) } .forEach { s in if let price = items[s] { print(price) } else { print(-1) } } |