LoginSignup
Pocketroppo
@Pocketroppo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【初心者】Paizaの問題集の解答例を教えてください

解決したいこと

paizaのスキルチェック問題集(JavaScript)をやっているのですが、ソートが苦手でどうしてもわからない問題があります。ChatGPTに投げても納得行く解答が得られなかったため、解答例を教えていただけると幸いです。よろしくお願い致します。

0

3Answer

とりあえず動作確認したものを抜粋して置いておきます.

reader.on('close', () => {
    const N = lines[0];
    // 個人の財産
    const person = [];

    for (let i = 0; i < N; i++) {
        const [g, s] = lines[i + 1].split(" ");
        person.push({ g, s });
    }

    // ソート
    person.sort((a, b) => {
        if (a.s === b.s) {
            return b.g - a.g;
        }
        return b.s - a.s;
    });

    person.forEach(p => console.log(`${p.g} ${p.s}`));
});

読み取ったデータに対し,シンプルに1人分のデータを1つのオブジェクト{g, s}にしてpersonに格納しています.
略記していますが{g, s}{g: g, s: s}と等価です.
中身はa.gのようにkeyを指定すれば取り出せるので,あとはsort内で同じkey同士を比較してやればいいです.

sortは元の配列を変更するため取扱注意です.

1

Comments

  1. @Pocketroppo

    Questioner
    ありがとうございます。シンプルで理解しやすいコードでとても助かります。
    const [g, s] = lines[i + 1].split(" ");
    でオブジェクトを作り、次の行でperson配列に格納しているのですね。

    オブジェクトは以下のような形式で作ると思い込んでいたので勉強になりました。
    const obj = {
    plan: 'free',
    name: '田中太郎',
    age: 30
    }
  2. @Pocketroppo

    Questioner
    というよりは、
    const [g, s] = lines[i + 1].split(" ");
    は、配列の中身をg, sの複数の変数(配列?)に代入し、g, sをオブジェクトのプロパティとして設定した上で、person配列に追加しているという理解の方が近いでしょうか。
    {g: g, s: s}を{g, s}と略せるのは知りませんでした。
  3. そうです.いったんg,sの各変数に入力を格納してから,オブジェクトを生成しています.
    変数の名前をkeyの名前に合わせておくと,このような略記が使えて便利ですし,可読性の面で有利なこともあります.あまり広いスコープの変数で用いるのはおすすめしません.ちょっとした入力を受け取るとか,末端の処理で一時的に用いる小技です.

1つのキーでのソートが分かっているのであれば、2つのキーを1つにしてソートする方法もあります。
例えば、
0 ≤ g_i, s_i ≤ 50 なので、w_i = s_i * 100 + g_i として新しいキーを作ります。
(g_i の最大の桁数が2なので、s_iを100倍しています。)
入力例2 では、

g_i s_i w_i
2 3 302
0 4 400
5 0 5
3 3 303

となるので、この w_i をキーとしてソートします。
ソート後は、
g_i は w_i を100で割った余り
s_i は w_i を100で割った商の整数部分、
として取り出すことで、出力することができます。

1

Comments

  1. @Pocketroppo

    Questioner
    ご回答ありがとうございます。この方法は思いつかなかったですが、とても賢いやり方ですね!後ほど試してみます。

JavaScriptだとArray.prototype.sortが使えそうですが,この使い方が分からないという話でしょうか?それともそもそも取っ掛りが分からないとか.
題意を読む限りソート効率とかは気にしなくてよさそうなので,ソートアルゴリズムまで説明するまでもなさそうですが,いかがでしょうか.

0

Comments

  1. @Pocketroppo

    Questioner
    ご回答ありがとうございます。
    キーが1つの場合はsort()を使って並び替えることができるのですが、2個以上のキー?がある場合のやり方がわからないという感じです。
    多分、オブジェクトやインスタンス、プロトタイプなどの使い方がよくわかってないせいだと思います。
    この問題の場合だと、それぞれの人に一個ずつ箱を渡して、手持ちの金と銀を入れてもらい、金の量と銀の量が書いてあるラベルを見て箱ごと並び替えるイメージでいたのですが、そもそも箱に入れるやり方がわからないというか… 金と銀を一つの資産の塊として見る方法がわからないというか…
    効率は気にしていないのですが、解法が全くわからず、この問題集には解答例も載っていないためこちらで質問させていただきました。

Your answer might help someone💌