🦁

AtCoder Beginner Contest 342 備忘録 (PHP)

2024/02/25に公開

B - Which is ahead?

問題はこちら
AtCoder Beginner Contest 342 B - Which is ahead?

解答

<?php

// 標準入力から人数Nを読み込む
$n = intval(trim(fgets(STDIN)));

// 標準入力から並んでいる人々の番号P_iを読み込む
$people = explode(' ', trim(fgets(STDIN)));

// 並び順を表す連想配列を作成する
$order = [];
foreach ($people as $index => $person) {
    $order[$person] = $index;
}

// 標準入力からクエリ数Qを読み込む
$q = intval(trim(fgets(STDIN)));

for ($i = 0; $i < $q; $i++) {
    // クエリを読み込む
    list($a, $b) = explode(' ', trim(fgets(STDIN)));

    // 並び順を比較し、より前にいる人の番号を出力
    if ($order[$a] < $order[$b]) {
        echo $a . "\n";
    } else {
        echo $b . "\n";
    }
}

つまづきポイント

  • 半角が間にあるとは気づかずexplodeを使えることがわからなかった
  • 人々の並び順とそれぞれの番号を連想配列にするという発想が出てこなかった

考察とポイント

一貫して変わらないのは各人の番号である

比較や配列でマッチをするときでも各人の番号で検索ができるようにすると都合がいい

そこで…
・最初の並び順を配列で取得後 
設定する↓
keyに各人の番号、valueに並び順の数値
その結果↓
keyの各人の番号で並び順の数値を引っ張り出す→比較ができる

参考になるページ

【PHP】配列

応用:このポイントが使えるシチュエーション

・指定された2人の学生の成績を比較して、より高い成績を持つ学生の名前を出力する

<?php

// 連想配列の作成
$grades = [
    'Alice' => 85,
    'Bob' => 78,
    'Charlie' => 92,
    'Diana' => 76
];

// list関数の使用
$input = "Alice Bob";
list($student1, $student2) = explode(' ', $input);

// 比較演算子の使用
if ($grades[$student1] > $grades[$student2]) {
    echo $student1 . " has a higher grade.\n";
} else {
    echo $student2 . " has a higher grade.\n";
}


Discussion