ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • indexOf 메소드 하드코딩하기
    Language/JavaScript 2022. 10. 29. 16:54

    Q. 문자와 문자열이 주어졌을때,  주어진 문자열에서 주어진 문자가 나타나는 첫번째 위치를 반환하는 getFind 함수를 작성하세요.

    Notes: 문자열의 첫번째 문자는 인덱스 값 0 을 가집니다. 만약 문자열에 해당 문자가 여러번 나타나면, 첫번째로 나타나는 위치를 반환해야 합니다. 만약 문자가 문자열에 존재하지 않는다면, -1 을 반환해야 합니다.

    중요!! indexOf 함수를 사용하지 마세요.

    const output = getFind('a', 'I am a hacker')
    console.log(output) // --> 2

     

    이 문제를 풀 때 주어진 filter가 sentence에서 처음 나타나는 index를 반환 하는 로직을 만드는 것은 어렵지 않았다.

    function getFind(filter, sentence) {
      let index = [];
      let result;
      const arr = sentence.split('')
        arr.forEach((item, i) => {
          if (item === filter) {
          index.push(i)      
          }
        })
        result = index[0]
      return result;
    }

    주어진 문장을 단어별로 배열로 나누어주고 filter가 존재하는 index 값을 별도 배열에 담아 해당 배열의 가장 첫 번째 요소를 리턴해주면 함수가 완성되기 때문이다. 우려되는 점은 white space가 그대로 split된 배열에 담기는지 확인이 필요했다. 그래서 공백도 배열에 담기는 것을 확인하고 로직을 그대로 위의 식으로 담았다.

    그러고 나서 테스트를 돌렸는데 정답이 아니었다.

     

    뭐지? 싶어서 확인해보니 위에 적은 코드는 filter가 sentence에 존재하지 않을 때 -1을 반환해야 한다는 문제 조건을 충족하지 못했다.

    그래서 예시로 나온 sentence에 존재하지 않는 filter를 넣고 함수를 돌려보니 "undefined"가 반환되었다.

     

    그래서 저 undefined를 -1로 돌리기 위해 아래와 같이 코드를 수정했다.

    문제를 풀 당시에는 뭔가 비효율적이긴 했지만 아래와 같이 코드를 적어서 제출했다.

    물론 문제는 통과했지만 마음에 들지 않았다.

     

    function getFind(filter, sentence) {
      const arr = sentence.split('');
      let index = [];
      if (arr.find(item => item === filter) === undefined) {
        result = -1
      } else {
      arr.forEach((item, i) => { 
        if (filter === item) {
          index.push(i);
          result = index[0]
        }
      });
      }
      return result
    }

    그래서 위 식을 어떻게 더 간단하게 적을까 다시 생각해보고 아래와 같이 코드를 수정했다.

     

    function getFind(filter, sentence) {
      let index = [];
      let result;
      const arr = [...sentence]
        arr.forEach((item, i) => {
          if (item === filter) {
          index.push(i)      
          }
        });
        result = index[0]
      if (result === undefined) {
        return -1
      } else {
        return result
      }
    }
    
    console.log(getFind('', 'I am a hacker'))

    처음에 제출한 코드는 find 메소드를 써서 filter가 sentence에 있는지를 처음에 판단한다. 그런데 굳이 find 메소드를 돌릴 필요가 있나? 싶었다. 그냥 맨 처음 작성한 식에서 결과가 undefined 일 때 -1을 반환하게 코드만 작성하면 되는 것이었는데, 컴퓨터에게 판단할 거리를 하나 더 줘서 비효율을 만들 필요는 없으니까.

    댓글