paiza Cランクレベルアップメニュー「辞書 PHP編」FINAL問題

こんな難しい問題、M野先生の授業でもやらなかった。
いや、やったかな・・・?

普段Aレベルアップメニューを解いていますが、それでも相当難しかったです。
C問題ってこんな難しかったでしたっけ。

参考になるかどうか、コードを置いておきます。
軽い気持ちではじめたのに思ったより大変。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!
    
    /*
    1 行目には A グループ、 B グループ、 C グループのそれぞれの人数 p , q , r が半角スペース区切りで与えられます。
    2 行目から (p + 1) 行目までは A グループの人の番号と
    その人が仕事を頼む B グループの人の番号 i_a, j_a (1 ≤ a ≤ p) が半角スペース区切りで、
    (p + 2) 行目から (p + q + 2) 行目までは B グループの人の番号と
    その人が仕事を頼む C グループの人の番号 j’_b , k_b (1 ≤ b ≤ q) が半角スペース区切りで与えられます。
    */

    $s = explode(" ",trim(fgets(STDIN)));
    $a_num = $s[0];
    $b_num = $s[1];
    $c_num = $s[2];
    
    //group aについて
    for ($i = 0; $i < $a_num; $i++) {
        $t = explode(" ",trim(fgets(STDIN)));
        $group_a[] = array("no"=>$t[0], "to_work_b"=>$t[1]);
    }
    //print_r($group_a);
    
    //group bについて
    for ($i = 0; $i < $b_num; $i++) {
        $r = explode(" ",trim(fgets(STDIN)));
        $group_b[] = array("no" => $r[0], "to_work_c" => $r[1]);
    }
    //print_r($group_b);
    
    
    //aが頼むbがもっているcの情報を得る
    for ($i = 0; $i < $a_num; $i++) {
        for ($j = 0; $j < $b_num; $j++) {
            if($group_a[$i]["to_work_b"] == $group_b[$j]["no"]){
                $group_a[$i]["to_work_c"] = $group_b[$j]["to_work_c"];
            }
        }
    }
    
    //print_r($group_a);
    
    // 列方向の配列を得る
    foreach ($group_a as $key => $row) {
        $array_no[$key] = $row['no'];
    }
    array_multisort($array_no, SORT_ASC, $group_a);//group_aのno.でソート
    
    //print_r($group_a);
    
        
    for ($i = 0; $i < $a_num; $i++) {
        echo($group_a[$i]["no"]." ".$group_a[$i]["to_work_c"]."\n");
    }


?>

配列group_aなどのキーを「no」(no.のつもり)と付けてしまったので
まぎらわしくなってしまったかも。
今思えば「id」とかのほうが良かったですね。
変数名はいつも悩みどころです。

参考元:array_multisort 関数

http://yantona.jugem.jp/?eid=334

この記事の問題があるページはこちら

paiza Cランクレベルアップメニュー php編

https://paiza.jp/works/mondai/c_rank_level_up_problems/problem_index?language_uid=php
2+