このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のCランクレベルアップメニューから「ソート (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
N 人の人々がおり、それぞれの人は金と銀を何キログラムか持っています。今は金の方が銀よりも価値が高いですが、ある日金と銀の価値が逆転して、人々の財産の多さは次のように決定されるようになりました。
- 持っている銀が多い方が財産が多い。
- 持っている銀が同じなら、持っている金が多い方が財産が多い。
それぞれの人が持っている金と銀のキログラム数が与えられるので、この規則にしたがって、財産を多い順に並び替えて出力してください。
入力される値
入力は以下のフォーマットで与えられます。
1 2 3 4 |
N g_1 s_1 ... g_N s_N |
- 1 行目には人々の数を表す整数 N が与えられ、 2 行目から (N + 1) 行目には、人々が持っている金の量 g_i と銀の量 s_i がそれぞれ半角スペース区切りで N 行与えられます (1 ≤ i ≤ N)。
期待する出力
上の規則に従って人々の財産を並び替え、入力と同じ形式で、各 g_i, s_i を半角スペース区切りで、財産が多い順に N 行出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
考え方
執筆中
直前の問題が解けていれば難しい問題ではない。
この問題の解答をそのまま使い、比較する項目の順番を入れ替えるだけ。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 1行目は読み飛ばす _ = readLine()! // 2行目以降を二次元配列にする let ia = Array(AnyIterator { readLine() }) .map { $0.split(separator: " ") .map { Int($0)! } } // まず、配列の第一要素で比較を行い、同じであれば第二要素で比較を行う // 最後に配列から取り出し、空白を入れて出力する ia.sorted(by: { $0[1] > $1[1] ? true : ($0[1] == $1[1] ? $0[0] > $1[0] : false)}) .forEach { print($0.map { String($0)}.joined(separator: " ")) } |