文字列の一部を追加したりする操作って、意外と最初はピンとこない…。今回は文字列の挿入問題について解説する!
🔍 問題概要
文字列 S, T と整数 N が与えられるので、S の N文字目の「後ろ」に T を挿入して出力せよ。
入力例:
abcde
fghij
5
出力例:
abcdefghij
🛠 解き方:sliceで分割&合体
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const S = lines[0];
const T = lines[1];
const N = Number(lines[2]);
// S の N文字目の後ろ → index N で分割(0-indexed)
const result = S.slice(0, N) + T + S.slice(N);
console.log(result);
});
-
Nは 1-based(1 文字目が 1) -
sliceは 0-based(1 文字目が index 0)
この一行で「前半 +T+ 後半」が完成!sliceは本当に便利。
💡他のコード例
「他のやり方」や「新しいメソッド」に挑戦するのも良い練習になるので、以下にいくつかの別解を紹介する!
方法①:配列に変換して splice() を使う
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const S = lines[0];
const T = lines[1];
const N = Number(lines[2]);
const arr = S.split(''); // 文字列を配列に分解
arr.splice(N, 0, T); // N 番目の位置に T を挿入
console.log(arr.join('')); // 配列を文字列に戻す
});
方法②:substring() を使う
const result = S.substring(0, N) + T + S.substring(N);
※ slice() と似てるが、引数が負のときの挙動が違う。
方法③:replace() + 正規表現(ちょっと強引)
const result = S.replace(new RegExp(`^(.{${N}})`), `$1${T}`);
-
^(.{N})は先頭からN文字をキャプチャ -
$1${T}でその直後にTを挿入
方法④:スプレッド構文を使って splice()
const arr = [...S]; // スプレッド構文で配列化
arr.splice(N, 0, T);
console.log(arr.join(''));
✅ 気づきメモ
-
slice()で切ってつなぐのが一番直感的でシンプル! -
splice()は配列操作だから、ちょっと大げさ -
substring()でも同じことはできるけど、負の数の扱いがちょっと違うので注意 -
replace()+正規表現でもゴリ押しできるけど、読みづらい
新しく学んだこと
-
slice()とsubstring()の違い:負の数の扱いに注意 -
splice()は配列にしか使えない
まとめ
ちょっとした操作でも、いろんなやり方があるのが面白いところ!
これからも、「他のやり方」や「新しいメソッド」に挑戦したい!