JavaScriptの配列・条件分岐・繰り返し
JavaScriptはWeb制作で使われる言語ですが、配列や繰り返しの考え方は情報Ⅰのアルゴリズム学習にも役立ちます。
配列とlength
JavaScriptでは、複数の値をまとめるときに配列を使います。nums = [4, 7, 2] のような形で値を並べ、nums[0] が最初の値、nums[1] が2番目の値になります。PythonやDNCLと同じく、添字は0から始まります。
配列の要素数は nums.length で取得します。共通テスト形式の問題では、最後の添字が nums.length - 1 になる点が重要です。隣り合う値を比較するときは nums[i + 1] を使うため、i を最後まで進めると範囲外を参照してしまいます。
if文と条件式
JavaScriptの条件分岐は if (条件) { ... } の形で書きます。条件が真のときだけ、波かっこの中の処理が実行されます。例えば if (score >= 60) は、score が60以上のときにだけ実行されます。
複数の条件を同時に満たす場合は &&、どちらかを満たせばよい場合は || を使います。問題を解くときは、記号をそのまま眺めるより、「かつ」「または」と日本語に直すと読みやすくなります。
for文の読み方
JavaScriptの代表的な繰り返しは for (let i = 0; i < nums.length; i++) です。これは「iを0から始め、nums.lengthより小さい間、iを1ずつ増やす」という意味です。配列の全要素を添字で順に調べるときによく使います。
配列の値そのものを順番に取り出す場合は for (const n of nums) のように書くこともあります。添字が必要な問題では通常のfor文、値だけ見ればよい問題ではfor...ofが読みやすい、という違いがあります。
集計・最大値・抽出
合計を求めるときは、total のような変数を0から始め、条件に合う値を足していきます。最大値を求めるときは、仮の最大値を置き、より大きい値が出たら更新します。JavaScriptでは Math.max(...nums) のような書き方もありますが、共通テスト対策では「更新の流れ」を読めることが大切です。
また、条件を満たす要素だけを取り出すときは filter が使われます。例えば nums.filter(n => n % 2 == 0) は、偶数だけを残します。関数の形に慣れていなくても、「条件に合うものだけを残す」と考えると読みやすくなります。
for文の3つの部分を分けて読む
JavaScript の for 文は、かっこの中に3つの部分がセミコロンで区切られて入っています。 まとめて読もうとすると難しく見えますが、分けて読めば単純です。
for (let i = 0; i < nums.length; i++) {
↑ ↑ ↑
①開始 ②続ける条件 ③1周ごとの変化
}
| 書き方 | i がとる値 | 回数 |
|---|---|---|
| i = 0; i < 5; i++ | 0, 1, 2, 3, 4 | 5回 |
| i = 0; i <= 5; i++ | 0, 1, 2, 3, 4, 5 | 6回 |
| i = 1; i < 5; i++ | 1, 2, 3, 4 | 4回 |
| i = 0; i < nums.length; i++ | 0 〜 要素数-1 | 要素数と同じ |
< と <= で回数が1回変わります。
共通テスト用プログラム表記の「0 から 5 まで」は両端を含むので、
JavaScript では i <= 5 にあたります。表記による違いを意識してください。
コード例と実行結果
頻出の処理を、実際のコードと出力で確認します。
合計と個数を同時に求める
const nums = [1, 4, 6, 7, 10];
let total = 0;
let count = 0;
for (let i = 0; i < nums.length; i++) {
total = total + nums[i];
if (nums[i] % 2 === 0) {
count = count + 1;
}
}
console.log(total, count); // 28 3
最大値とその位置を求める
const nums = [4, 9, 2, 7];
let mx = nums[0];
let mxPos = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] > mx) {
mx = nums[i];
mxPos = i;
}
}
console.log(mx, mxPos); // 9 1
隣どうしを比べる
const nums = [3, 7, 10];
let up = 0;
for (let i = 0; i < nums.length - 1; i++) {
if (nums[i] < nums[i + 1]) {
up = up + 1;
}
}
console.log(up); // 2
3つ目の例で、繰り返しの条件が nums.length - 1 になっている点に注目してください。
nums[i + 1] を使うので、i を最後まで進めると範囲外になります。
隣どうしの比較では必ず1つ手前で止めます。詳しくは
繰り返しの回数を数えるで扱っています。
JavaScript特有のつまずき
| つまずき | 内容 |
|---|---|
| = と == と === | = は代入、== と === は比較。比較は === を使うのが基本 |
| let と const | 値が変わる変数は let、変わらないものは const |
| 割り算 | 7 / 2 は 3.5。整数にするには Math.floor(7 / 2) |
| 波かっこの範囲 | { } がどこまでかで、if の内側か外側かが変わる |
| && と || | 「かつ」は &&、「または」は || |
Python がインデントで処理のまとまりを表すのに対し、JavaScript は波かっこで表します。
見た目が違うだけで、意味は同じです。
擬似言語の | と ⎿ も、同じく「まとまり」を示す記号です。
3つの表記は書き方が違うだけで、処理の構造は共通だと押さえてください。