奇妙な文字を作成


プログラマ


https://programmers.co.kr/learn/courses/30/lessons/12930

私の答え

function solution(s){
  //모두 소문자로 변환
  //문자열을 공백을 기준으로 끊어서 배열에 저장
  //배열의 요소를 하나씩 꺼내와서 짝수번째를 대문자로 바꿔 새로운 배열에 저장
  //배열의 각 요소에 대한 반복이 끝나면 공백 추가
  //배열의 요소를 공백을 기준으로 합친다
  //마지막에 추가된 공백은 잘라준다
  s = s.toLowerCase();
  const arr = s.split(" ");
  const res = [];
  for(let i=0;i<arr.length;i++){
    for(let j=0;j<arr[i].length;j++){
      if(j%2===0){
        res.push(arr[i][j].toUpperCase());
      }else{
        res.push(arr[i][j]);
      }
    }
    res.push(" ");
  }
  return res.join("").slice(0,-1);
}

試した他の方法


偶数の2番目の文字を大文字に置き換えるにはreplaceメソッドを使用します。

  • replaceメソッドは、正規表現が使用されていない場合、1番目のパラメータと一致する1番目の文字列(文字列)が2番目のパラメータ(文字列)に置き換えられた文字列を返します.(既存の文字列は置換されません)

  • したがって、インデックスが偶数の場合に文字を大文字に変換しようとしても、replaceは、文字に一致する文字を最初から検索し、先に大文字に変更します.

  • 下図に示すように、予想される結果はAaAaAaであるが、replaceメソッドの特性により、前から順に大文字になる.

  • したがって、以下に記述するコードでは、arr[i][j]に一致する文字がjの前(奇数の2番目の文字であっても)であれば大文字に変換され、正規表現を使用しなければ所望の結果は生成されない.
  • for(let i=0;i<arr.length;i++){
      for(let j=0;j<arr[i].length;j++){
        if(j%2===0) {
          arr[i] = arr[i].replace(arr[i][j], arr[i][j].toUpperCase());
        } 
      }
    }

    文字列の変更

  • arr[i][j]を大文字に直接変更しようとしたが、文字列にはread-onlyプロパティがあるため、変更しない.
  • for(let i=0;i<arr.length;i++){
      for(let j=0;j<arr[i].length;j++){
        if(j%2===0) {
          if(j%2===0) arr[i][j]=arr[i][j].toUpperCase();
        }  
      }
    

    リファレンス


    「任意の配列文字列」でプログラマの問題を置き換える👇
    https://velog.io/@kaitlin_k/%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0
     for(let i=0; i<strings.length; i++){
        strings[i] = strings[i].replace(strings[i][0],""); // 앞에 추가된 문자 배열에 넣어주기
        answers.push(strings[i])
      }
    上記の解答では、0番目の文字だけが空の文字列に変更されたため、正常に動作します.(replaceは前から1つしか変更できませんが、0番目なので1つ目です!)
    正規表現を使用しない場合にreplaceを使用する場合は、最初に置換する文字列(最初のパラメータ値)を使用するか、重複していない場合に使用するのが適切です.