find the needle

오늘의 코드워는 find the needle 이라는 문제로 무턱대고 풀지 않고 조금만 차분하게 생각하고 mdn 만 뒤지면 금방 풀 수 있는 문제 였다. 물론 가정문이나 반복문을 사용해서 푼다면 조금 더 시간이 걸렸을 수도 있겠지만 오늘의 문제는 막상 풀고 보니 그렇게 어렵지는 않았다.

문제 조건

  • haystack 이라는 어레이가 주어진다 ex) [1, 2, 'sdfa', 'needle', 'e3f', 'dsaf']
  • 그 어레이에는 반드시 하나만의 ‘needle’ 이라는 엘리먼트가 들어간다.
  • ‘needle’의 index를 구해야 한다.

내 풀이법

1
2
3
function findNeedle(haystack) {
return "found the needle at position " + haystack.findIndex(str => str === "needle");
}

처음에는 다급한 마음에 가정문과 for loop를이용해서 풀려다 보니 로직이 계속 꼬여 버려서 속 터져 죽는 줄 알았다. 그러다가 mdn님께 index 찾는 메소드를 물어보니 얼씨구?? 바로 나와 버렸다.

ES6에 추가된 메소드인 findIndex이다. 근데 문제점이 하나 있다. 브라우저 서포트까지 읽어 봤더니만 역시 내가 제일 싫어하는 익스플로러에서는 아예 지원이 안된단다…. ㅠㅠ

다른 방식을 찾아야 겠다. 그래서 일단 답안을 제출하고 능력자 분들의 답안을 찾아보기 시작했다.

능력자 분들의 풀이법

사실 호환성으로 가장 뛰어난건 고전 방식으로 작성된 함수일 것이다.

1
2
3
4
5
6
7
8
9
10
11
function findNeedle(haystack) {
for(var i = 0; i < haystack.length; i++ ) {
var currentEl = haystack[i];
console.log(currentEl);
if(currentEl !== 'needle') {
continue;
} else {
return "found the needle at position " + i;
}
}
}

가장 간결한 방법은 아래 코드 같다.

1
const findNeedle = (haystack) => `found the needle at position ${haystack.indexOf('needle')}`;

위의 코드는 나와는 다르게 indexOf를 사용했다. findIndex같은 경우는 콜백을 받기 떄문에 더 복잡한 조건을 검색할 떄 괜찮지만 이런 간편한 값을 검색할 때는 그냥 indexOf가 더 편할 수도 있을 듯 하다.

정리

알고리즘 문제 풀면서 블로그에 정리해 보는 것도 오래간만인 것 같다. 요즘 슬럼프라고 알고리즘 문제를 소홀히 하고 있었다. 백수주제에..ㅎㅎ

목표를 다시 짰다. 일주일에 두문제.. 애초에 내 머리로 하루에 한 문제는 다른 것들 다 포기하고 알고리즘 문제만 잡고 있으라는 거랑 똑같으니.. 그냥 일주일에 두 문제로 합의를 해야 겠다.