プログラミング初心者修行シリーズ第一弾。
Progateにて基礎の学習を進め、実践的な問題にも挑戦していきたいと思い、paizaラーニングで提供されている問題に挑戦してみました。このシリーズでは自分の学習の振り返りもかねて記事にしていこうと考えていますので、間違った表現があるかもしれませんが、そこはご了承ください(笑)
今回は「paizaラーニング(スキルチェック過去問題集)」より出題された「単語のカウント(Cランク相当)」になります。
※ちなみに、paizaラーニングでは過去問題のみコード公開が可能なのでご注意ください。
問題
問題を見て私は「ん?」と思いました。
”スペースで区切られた英単語列が与えられます。
英単語列に含まれる英単語の出現回数を出現した順番に出力してください。”
とありますが、「どこに?」というような感じから始まり、問題を解くどころではありませんでした。なので、そもそものpaizaラーニングのシステムを理解しておかないと問題すら解けないことを悟り、まずは色々調べてみることにしました。
paizaでは何かしらの要素が与えられており、その要素を取得してから使用していくみたいです。
なんの要素が与えられているのか一度コードを書いて出力してみることにしました。
ここでは入力例1のものが与えられているようですが、この入力例だけではなく、様々な入力例にもコードが適用されるように書いていかなければならないのがこのpaizaの難しいところです。
初心者すぎる私はこの時点だけで数時間も経過しています。
というのも、後で書きますが「標準入力」「○○関数」「そもそも配列ってどんな概念だっけ?」と一つ一つ調べては考え、調べては考え…を繰り返していました。
そうこうしているうちに、配列から順番に取り出していくには「foreach文」を、重複している要素を除いていくには「array_unique関数」を、配列の中の要素の出現回数をカウントするには「array_count_values関数」をetc…
ググりまくってこんな時にはどうしたらいいかを必死で色んな記事を参考にしていきました。(今回使った構文や関数などは後でまとめて紹介しています)
段々と出力結果が答えに近くなっているのを確認しながら、自分の力だけでも意外と書けるぞというのをモチベーションにして最終的には正解までもっていくことが出来ました。
それでは今回の解答コードも紹介していきます。
解答コード
<?php
// 標準入力からの入力値を変数に代入します(fgets(STDIN)=標準入力)
$input_line = fgets(STDIN);
// 取得した入力値を半角スペースで分解します
$single_line_input = fgets(STDIN);
// 単一行の入力の場合はこれだけで各入力値が配列の要素として使えます(explode関数)
$array = explode(" ", trim($input_line));
//重複している要素を取り除く(array_unique関数)
$unique = array_unique($array);
//array_count_valuesを使用して値の使用回数をカウントする(array_count_values関数)
$array_count=array_count_values($array);
//配列から要素を順番に取り出して縦に並べる(foreach文)
foreach($array_count as $key=>$value){
echo $key.' ';
echo $value."\n";
}
?>
全ての入力例15個を通過し正解することが出来ました。
学んだコード
プログラムに渡される値やデータの標準(デフォルト)の入力元のこと。ただしファイルからのデータの読み込みの場合は、
standard input (標準入力)→「stdin」と略されて使用されることが多い
・fgets関数=ファイルの読み込みを行う関数
・explode関数=文字列を指定した文字列で分割する関数
・trim関数=文字列の先頭と末尾にある空白文字を取り除く
・array_unique関数=PHPの配列で重複した値を削除する
・array_count_values関数=配列の要素の出現回数をカウントする
・foreach文=配列の中にある要素の数分、先頭から順番に繰り返し処理を行う
・「“\n”」=改行コード
最後に
まだまだ分からないことだらけのプログラミング初心者ですが、地道にコツコツと知識を積み上げていこうと思います。
これからもブログの記事を通して学んだことを蓄積させていければと思っています。
いつかこのブログが辞書のように使える日まで努力していきます。