0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

指定範囲だけ大文字 toUpperCase()

Posted at

今回は 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 = 5s.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 ループで条件付き変換
      のようなパターンがある。




僕の失敗談(´;ω;`)と解決法🐈

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?