Error 3. if분기점 순서의 중요성

깡통·2024년 2월 10일
0

  • if문 분기점이 바로 아래 else if문 분기점을 포함하는 조건을 가지고 있기 때문에 else if 문에서 처리돼야 할 분기가 1번째 분기의 비즈니스 로직에서 처리되고 있었고, 그래서 undefined가 발생함

  • 이렇게 순서를 바꾸니까 정상적으로 작동함
  • 추신: toUpperCase()/toLowerCase()는 배열요소의 프로토타입 상속 체인 상에 존재하지 않는 메서드이다. 억지로 배열 메서드로서 작동시킬 수는 있으나, 한 로직에서 작동한다 해도 바로 다음 로직에서는 에러를 낼 수 있을 만큼 불안정해지니 사용하지 않는 것이 좋다.

-빈칸이 어떻게 표현되는가 개념

Javascript

function solution(s, n) {
  var answer = "";

  var lowerCase = "abcdefghijklmnopqrstuvwxyz";
  var upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var array = [];

  for (let i = 0; i < s.length; i++) {
    //1-1. n의 알파벳 하나 당 lowerCase 배열 내의 인덱스 전체를 돌면서 확인하도록 유도
    for (let j = 0; j < lowerCase.length; j++) {
      //1-2. 인덱스를 찾으면, 그 인덱스에 해owerCase[j])
      //1-3. lowerCase[j+n] === undefined(인덱스 번호가 z 다음어야 돼서 존재하지 않을 때)
      if (s[i] === lowerCase[j] && lowerCase[j + n] === undefined) {
        array.push(lowerCase[n - 1]);

        break;
      } else if (s[i] === lowerCase[j]) {

        array.push(lowerCase[j + n]);
 
        break;
      } else if (s[i] === upperCase[j] && upperCase[j + n] === undefined) {
        array.push(upperCase[n - 1]);

        break;
      } else if (s[i] === upperCase[j]) {
        array.push(upperCase[j + n]);

        break;
      } else if (s[i] === " ") {
        array.push(" ");

        break;
      }
      // var ss = array.join("");
      // var newArray = [];
  }


  answer = array.join("");

  return answer;
}
solution("XxYzKoPPPPsdfsaf", 5);
  • 위 코드의 결과는 EeEePtUUUUxikxfk임,
  • 근데 나는 BbBb~ 를 예상했음. 왜 이렇게 된 걸까?
  • 비결은
else if (s[i] === upperCase[j] && upperCase[j + n] === undefined) {
        array.push(upperCase[n - 1]);

여기에 있었음, j+n의 j가 무조건 26번째 알파벳 z가 된다는 보장이 없는데, j가 25를 초과하는 경우 무조건 n-1로 일률적으로 수를 재구성하도록 로직을 짰으니, 당연히 틀릴 수 밖에 없었던 거다.

  • 'n-1' 대신 'j - (26-1) + n - 1' 을 넣어서 j가 26개의 알파벳 중에 몇번 째 자리에 있는지를 먼저 확인하고, 그 다음에 n을 더했어야 맞다.(j ('26-1'과 'n-1'은 둘 다 0에서 시작하기 때문임)

function solution(s, n) {
    var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var lower = "abcdefghijklmnopqrstuvwxyz";
    var answer= '';

    for(var i =0; i <s.length; i++){
        var text = s[i];
        if(text == ' ') {
            answer += ' '; 
            continue;
        }
        var textArr = upper.includes(text) ? upper : lower;
        var index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;
        answer += textArr[index];
    }
    return answer;
}
  • 나와 같은 맥락으로 풀었지만, 나보다 훨씬 깔끔하게 잘 푼 사람
  • 이 사람은 알파벳 위치에 n을 처음부터 더해서 index를 만들어서 사용함
  • 그리고 upper 문자열에 includes() 메서드를 사용해서 upper에 해당 문자열에 있으면(대문자면) 그대로 놔두고, 없으면 lower에 있는걸로 가져옴(어차피 lower에 있으니)
profile
코딩하러 온 사람입니다.

0개의 댓글