このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のCランクレベルアップメニューから「辞書データの順序 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
n 人の人の名前 s_1, …, s_n が与えられたのち、 m 回の「攻撃」に関する情報が与えられます。各行は “p_i a_i” というフォーマットで与えられ、 p_i はダメージを受けた人の名前 (s_1, …, s_n のいずれか) 、 a_i は p_i が受けたダメージ数を表す数です。なお、一度もダメージを受けていない人の合計ダメージは 0 とします。
それぞれの人が受けたダメージを、人の名前のアルファベットの辞書順に出力してください。
入力される値
入力は以下のフォーマットで与えられます。
1 2 3 4 5 6 7 8 |
n s_1 ... s_n m p_1 a_1 ... p_m a_m |
- 1 行目には正整数 n が与えられ、 2 行目から (n + 1) 行目には人の名前 s_1, ..., s_n が改行区切りで与えられます。 (n + 2) 行目には正整数 m が与えられ、 (n + 3) 行目から (n + m + 2) 行目には人の名前 p_i ( s_1, ..., s_n のいずれか) とその人が受けたダメージ a_i が "p_i a_i" という半角スペース区切りのフォーマットで m 行与えられます。
期待する出力
それぞれの人が受けたダメージを、人の名前のアルファベットの辞書順に
n 行出力してください(出力するのはダメージだけです)。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
考え方
執筆中。
Swift には順序つき辞書はあるが、immutable(書き換え不可能)でソートできないため、タブルの配列を使って同様の機能を実行する。
基本的なアルゴリズムは下記の記事と同じ。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// ダメージを記録する辞書 var damages:[(name: String, damage: Int)] = [] // 人数分の辞書で初期化 var i = Int(readLine()!)! for _ in 0..<i { damages.append((readLine()!, 0)) } // ダメージを加算 i = Int(readLine()!)! for _ in 0..<i { let sa = readLine()!.split(separator: " ").map{ String($0) } // タプル内から該当するユーザのインデックスを得る if let index = damages.firstIndex(where: {$0.name == sa[0]} ) { damages[index].damage += Int(sa[1])! } } // ソートしてダメージだけを出力する damages.sorted(by: {$0.name < $1.name}).forEach { print($0.damage) } |