지난 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가 생각났는데 막상 사용하지 말라고 하니 막막했다. 그래서 우선 문제를 쪼개 하나씩 풀어보기로 했다.
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라면 일치하는 값이 없다는 뜻 } }
function getFind(filter, sentence) { let condition = sentence.includes(filter); if(!condition) { return -1 } else { return sentence.search(filter); } }
확실히 코드가 더 효율적으로 변했다.
문제를 풀 수 있는 다양한 방법이 있고, 그 중에서도 더 효율적인 방법이 있다는 점에서 코딩은 매력적이다.