前提
この問題はpaizaラーニングのレベルアップメニュー問題における質問となります。
このコーナー内の問題については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由とされておりますため、こちらの質問をさせていただきます。
解決したいこと
"問題"自体は解決してはいますが、自身のやり方に違和感を得ています。
(他の同じランクの問題を解く限りにおいては、、そのため)多分、知らなければいけない基礎的な何かを見落としているのではないかと考えています。
"問題"が解答者に伝えたい、教えたい内容を正しく理解しながら進みたいと考えているのですが、こうして時々それがわからない。模範解答もないので、、、
今回、辞書式ソートについての考え方に関して意見が複数欲しいため、皆様の最適な考え方を教えていただければと考えています。
該当の問題の文章
正整数 n が与えられ、数のペアが n 個与えられます。各ペアの最初の数はりんごの個数を、その次の数はバナナの個数を表しています。これらの数のペアを以下の規則に従って、偉い順に並び替えてください。
- ふたつのペアのりんごの数が異なる場合、りんごの数が多い方が偉い(この際、バナナの数は関係ない)。
- りんごの数が同じである場合、バナナの数が多い方が偉い。
入力が以下の時、
2 1 13 2 2 2 4 11 12
出力は
11 12
2 4
2 2
1 13
条件として入力される数値はいずれも1以上、50以下 ### 1.最初の考え方 入力される数値から51進数の2桁の数と考え、その大小を問うように考えた。 2進数や10進数に直すと記述が長大になるので、そのまま51進数として、数字が重ならないようにりんごを100倍してみかんの数字との和の配列に入れて、大小のソートをした。 出力する時、一つずつ取り出しりんごは100の除算、みかんはその剰余として、スペースで連結した文字列を出力した。 * ただ、問題名になっている「辞書式」には一切関係ないやり方のため、出来なければいけないことが何か違うのではないかと考えた。 * ランク(D)からして基礎的な内容のはずで、(実際にこれ以外の問題はかなり素直で簡素)「辞書式」の大事な考え方がここから学べるのではないかと考えています。 しかし、sortやCollectionクラスを見ても、うまく文字列でどうにかできそうになく、、、 ### 2.次に考えたこと 文字列として扱って上手にソートするのが本当の課題だと考えて、文字列としてソートして出力することを前提にしてみたが、いまいちすっきりしない。 りんご、みかんの入力値は文字列ごと取り込んで、配列に格納したが、この状態ではうまくソートができな("1 50" < "10 35" < "5 2")かったので、 Scannerはやはり数字で取り込んで、一桁の場合は文字列"0"を足して、りんごとみかんを足した文字列を、配列に格納しソートした("01 50" < "05 02" < "10 35")。 ただ、どうしても有縁なコードの書き方にならざるを得ません。 .charAt(0)と(3)が"0"の時とそれ以外の時で、substringで抜き出す文字列を場合分けすることで問題自体は解決はすることはしますが、 配列に入れる時も、並び替えた配列から取り出して出力する時も、 条件分岐をそれぞれ長々と書き連ねなければならず、記述量自体は1のやり方の倍以上になりますし、それまで解いていた同じDランクの問題からしてもこんな有縁な方法になるのか?とどうしても疑問に思ってしまいます。 ### 他のやり方がないか? 入力した文字列を変数, 1の数字の値を代入した、変数が入った配列を作って、並び替えた後、変数自体を出力する?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/04 08:48 編集