弊社ではAtCoder的な競プロに挑戦する社内イベントを毎月開催しており、そこで私がよく使っている構文や関数を簡潔に紹介します。
JavaScriptで競プロを解く際は必須レベルで登場回数が多いものばかりなので、ぜひ参考にしていただければ幸いです。
私自身そこまでプログラミングが得意ではないため、この記事では基本的な部分だけ紹介しています。
入力処理
これがないとそもそも標準入力を受け付けられないので、毎回書く内容となっています。
JavaScript(Node.js)では標準入力を受け付ける構文がそこそこ長くてめんどくさいです。
require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n')
// 標準入力を行単位で配列として取得。AtCoderでの基本形。
.split(' ').map(Number)
// 1行の文字列を空白区切りで数値配列に変換。入力パースの定番。
定数に格納して使うことが多いです。
const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
// require('fs') = Node.jsの組み込みモジュール「fs (File System) 」を読み込む
// .readFileSync = 同期的にファイルを読み込むメソッド
// ('/dev/stdin', 'utf8') = 標準入力を意味する特殊ファイル
// .trim() = 標準入力の前後のスペースと改行を除去
// .split('\n') = 標準入力を改行で区切り、配列にする
繰り返し構文
for (let i=0; i<N; i++) { ... }
// N回ループ。インデックスを使う場面で基本
for (const x of 配列名) { ... }
// 配列要素を順に処理。添字不要なら便利
配列名.forEach((val, idx)=>{ ... })
// 短い処理に便利。ただし途中でbreakできない
配列生成・初期化
Array(N).fill(0)
// 長さNの配列を0で初期化。DPや累積和に多用
Array.from({length:N},(_,i)=>i)
// 0からN-1までの配列を生成。連番が欲しいとき便利
ソート
配列名.sort((a,b)=>a-b)
// 数値の昇順ソート。数値比較には必須
配列名.sort((a,b)=>b-a)
// 数値の降順ソート。大きい順に並べたいとき
文字列処理
変数名.split('')
// 文字列を1文字ごとの配列に変換
変数名.split('').reverse().join('')
// 文字列を逆順にする
変数名.includes('abc')
// 部分文字列が含まれているか判定
変数名.charCodeAt(i)-'a'.charCodeAt(0)
// アルファベットを0起点の数値に変換
数学系
Math.max(...配列名) / Math.min(...配列名)
// 配列から最大値・最小値を取得
Math.floor(x)
// 小数を切り捨て
Math.ceil(x)
// 小数を切り上げ
Math.abs(x)
// 絶対値を取得
集合・辞書
new Set()
// 要素の重複を排除できるコレクション。set.has(x)で存在判定
new Map()
// キーと値を対応付ける辞書。map.set(key,value)で登録
よくあるテクニック
配列名[i].split(' ').map(Number)
// 行を数値配列に変換する定番処理
const prefix = Array(N+1).fill(0)
// 累積和用の配列を確保
let ans = Infinity / let ans = -Infinity
// 最小値・最大値を探索するときの初期値