31_JS test 리뷰

charlie_·2021년 7월 16일
0

TIL

목록 보기
30/42
post-thumbnail

지난 16일(금) 위코드에서 2주간의 프리코스를 마치며 가벼운 test를 진행했다.
그 동안 배운 JS지식을 제대로 활용할 수 있는지를 확인하기 위한 test였다.
총 5문제 중에 4문제는 부담이 없었지만 1문제는 푸는 데에 에러가 뜨는 바람에 좀 헤맸다. 그래서 그 문제에 대해 리뷰해보려 한다.

Q. 문제 내용

문자열에 해당 문자가 여러번 나타나면, 첫번째로 나타나는 위치를 반환해야 합니다. 
만약 문자가 문자열에 존재하지 않는다면, -1 을 반환해야 합니다.
중요!! indexOf 함수를 사용하지 마세요.

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

처음 보자마자 indexOf가 생각났는데 막상 사용하지 말라고 하니 막막했다. 그래서 우선 문제를 쪼개 하나씩 풀어보기로 했다.

  • 풀이 접근 방법
    1) 해당 문자를 찾는다.
    2) 문자가 있을 경우 해당 인덱스값을 반환한다.
    3) 문자가 중복될 경우 제일 첫 번째로 나타나는 문자의 위치를 반환한다.
    4) 문자가 없을 경우 -1을 반환한다.

3)번까지는 크게 어렵지 않게 풀 수 있었다.

function getFind(filter, sentence) { 
  let result;

  for(let i = 0; i < sentence.length; i++) {
    if(sentence[i] === filter) {
// 문자열 타입은 배열처럼 각각의 글자에 index값이 부여된다는 점을 활용
      return  i;
      return result;
      break;
// 첫 번째 값만 찾으면 되니 로딩시간을 줄일겸 `break`를 넣었다.
    }
  }
}    

하지만 4)번이 복병이라는 것을 이 때까지는 알지 못했다.

for(let i = 0; i < sentence.length; i++) {
  if(sentence[i] === filter) {
      result = i;
      return result;
    } else if (sentence.length - 1 !== filter){
  	  return -1
    }
}

처음에는 막연히 마지막 글자까지 반복된 후에 결과값이 없으면 -1을 반환하면 될거라고 생각했다. 하지만 filter값이 sentence의 마지막 글자와 일치하지 않는 경우 else if의 조건은 항상 참이 되는 문제가 있었다.

한참을 고민하다가 도저히 답이 안보여서 접근 방법자체가 문제일 수도 있겠다는 생각이 들었다. 그래서 일치하는 글자가 없을 경우 result에 어떤 값이 찍히는지 확인해봤더니 undefined가 도출되는 것을 알 수 있었다.

아래는 이를 활용해 오류를 해결하고 답으로 제출한 코드이다.

function getFind(filter, sentence) { 
  let result;

  for(let i = 0; i < sentence.length; i++) {
    if(sentence[i] === filter) {
      result = i;
      return result;
      break;
    }
  }

  if(result === undefined) {
    return -1
// 반복문이 종료된 후에 result의 값이 undefined라면 일치하는 값이 없다는 뜻
  }
}
  • 나중에 알게 된 사실이지만 include와 search를 활용해 더 효율적인 코드를 짤 수도 있었다고 한다. 문제가 발생했을 때 mdn에서 발견한 method였지만 정확히 이해하지 못했기에 적용할 수가 없었다.
function getFind(filter, sentence) { 
  let condition = sentence.includes(filter);

  if(!condition) {
    return -1
  } else {
    return sentence.search(filter);
  }
}
  • 확실히 코드가 더 효율적으로 변했다.

  • 문제를 풀 수 있는 다양한 방법이 있고, 그 중에서도 더 효율적인 방법이 있다는 점에서 코딩은 매력적이다.

profile
매일 하루에 딱 한 걸음만

0개의 댓글