解答例
皆さん、こんにちは
<=>という訳の分からない演算子を使って解きました。
三方比較演算子、宇宙船演算子というらしいです。かっこいいので宇宙船演算子と呼びます。(宇宙船ぽいからこの名前?)
<?php
$n = intval(trim(fgets(STDIN)));
$a = [];
for ($i = 0; $i < $n; $i++) {
[$a0, $a1] = explode(' ', trim(fgets(STDIN)));
$a[] = [$a0, $a1];
}
// 上記の処理は2次元配列を作成する
上の処理は割愛。
usort($a, function ($a, $b) {
// ユーザー定義の比較関数を使用して配列をソートする
return $a[1] <=> $b[1];
// 2列目のほうが優先度が低いので、宇宙船演算子を使い、先にソート
});
usort($a, function ($a, $b) {
return $a[0] <=> $b[0];
// 1列目のほうが優先度が高いので、宇宙船演算子を使い、あとにソート
});
上記のsortが肝になると思います。
連想配列で試しましたが、重複する値があるので、sortした際に重複した値が消えてしまい使えません。
なので二次元配列で考えてみました。そして、値が重複した際にも比較ができるような、ユーザー定義のsort関数を作成しました。
そこで宇宙船演算子(かっこいい...)を使用しています。
処理の細かい解説は、コメントを参照してください。
foreach ($a as $pair) {
echo implode(' ', $pair) . "\n";
}
?>
あとは、出力して完了です。
参考文献
こちらの記事を参考にさせていただきました。
問題