今回は paiza の「指定範囲だけ大文字」に挑戦!
旧 Bランクレベルアップメニューを学習中!
問題概要
- スペース区切りの2つの整数と、文字列が入力される。
- 2つの整数の範囲の部分文字列を、大文字にして出力。
※ 文字列 s に含まれる記号やスペースは、変形せずそのまま出力。
入力例:
2 6 // 範囲 a b
this is a pen // 文字列 s
出力例:
tHIS Is a pen
❌ NG例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [a, b] = lines[0].split(' ').map(Number);
const s = lines[1];
const uppercaseConversion = s.slice(a-1, b).toUpperCase();
const result = s.splice(a-1, b - a, uppercaseConversion);
console.log(result);
});
⚠️ 大前提:spliceは文字列に使えない
例:
-
s = “abcdefg” -
a = 3, b = 5→s.slice(2, 5)= “cde” → “CDE”
s.splice(2, 3, “CDE”) をしたと仮定すると:
インデックス2から3文字 (cde) が 削除 される。
→ 削除結果 = “cde”
→ 元の文字列は “ab” + “CDE” + “fg” = “abCDEfg”
でも splice の戻り値は “cde” なので、result には “cde” が入る。
修正するなら、splice の戻り値ではなく「加工後の文字列そのもの」を console.log(s) すべきということ。
※ splice は破壊的メソッドなので s が直接加工されて変更される。
✅ OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [a, b] = lines[0].split(' ').map(Number);
const s = lines[1];
const uppercaseConversion = s.slice(a-1, b).toUpperCase();
const result = [s.slice(0, a-1), uppercaseConversion, s.slice(b)].join('');
console.log(result);
});
-
slice(0, a-1): 前半部分 -
slice(a-1, b): 大文字化する部分 -
slice(b): 後半部分 -
join('')でつなぎ合わせる - → 非破壊的で安全に文字列を作れる。
✅ OK例 2:ループ + 条件分岐
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [a, b] = lines[0].split(' ').map(Number);
const s = lines[1];
const result = [];
for(let i = 0; i <= s.length; i++) {
if (a-1 <= i && i < b) {
result.push(s[i].toUpperCase());
continue;
}
result.push(s[i]);
}
console.log(result.join(''));
});
-
各文字を走査し、大文字化すべき範囲なら
toUpperCase()して格納。 -
そうでなければそのまま格納。
-
最後に
join('')で結合して出力。 -
sliceを使わずにアルゴリズム的に書くことで「処理フローを可視化」できる。
🗒️ めも・まとめ
-
spliceは配列用、文字列操作には使えない (splitとsliceは使える・非破壊)
-
toUpperCase()メソッドは、呼び出す文字列の値を(文字列でない場合、文字列に変換して)大文字に変換して返す。
- 部分的な変換は
-
sliceで分割して大文字化して結合 - もしくは
forループで条件付き変換
のようなパターンがある。
-