[알고리즘] indexOf vs findIndex

Day 2

// ✅ 내가 작성한 함수
export default function reversePrefix(word, ch) {
  const result = [];
  const wordArr = word.split("");
  const isChAlphabet = (element) => element === ch;
  const chIndex = wordArr.findIndex(isChAlphabet);
  const remainingWord = wordArr.slice(chIndex + 1).join("");

  if (!chIndex) return word;

  for (let i = chIndex; i >= 0; i--) {
    result.push(wordArr[i]);
  }

  return result.join("") + remainingWord;
}

// 다른 조원의 풀이 👀
export default function reversePrefix(word, ch) {
  const chIndex = word.indexOf(ch);

  if (chIndex === -1) {
    return word;
  }

  const wordArray = word.split("");
  const reversedWordArray = wordArray.splice(0, chIndex + 1).reverse();
  const answer = reversedWordArray.concat(wordArray).join("");

  return answer;
}
// ✅ test code
import { expect } from "chai";
import reversePrefix from "../lib/02-reversePrefixofWord";

describe("2. Reverse Prefix", () => {
  it("It should pass basic cases", () => {
    expect(reversePrefix("abcdefd", "d")).to.eql("dcbaefd");
    expect(reversePrefix("xyxzxe", "z")).to.eql("zxyxxe");
    expect(reversePrefix("abcd", "z")).to.eql("abcd");
  });
});

두 번째 알고리즘 풀이 시간을 가졌는데 이전에 과제에서 사용하였던 findIndex가 머리에 남아서인지 일반 배열에서의 일치하는 요소를 찾기 위한 메서드인 indexOf를 사용하지 않고 findIndex를 습관처럼 사용하게 되었다. 그러다 문득 둘의 차이를 제대로 인지하지 않고 쓰고 있다는 사실을 알게 되어 사소한 부분이지만 둘의 차이에 대해 정확히 정리해보고자 한다.

🌟 되짚어보게 된 점

  • findIndex() vs indexOf()

    두 메서드의 가장 큰 차이는 "매개변수" 라고 한다.

    - Array.prototype.indexOf()
    첫 번째 매개 변수로 값 을 예상합니다 . 따라서 기본 유형 (문자열, 숫자 또는 부울)의 배열에서 인덱스를 찾는 것이 좋음.
    이를 사용하여 "정확한 요소" 인덱스를 찾을 수 있지만 조건자를 전달할 수는 없다.
    특정 요소를 찾으려면 더 빠름.

    - Array.prototype.findIndex()
    원시 유형이 아닌 배열 (예 : 객체)의 인덱스가 필요하거나 찾기 조건이 단순한 값보다 더 복잡한 경우이 옵션을 사용.

    -> 즉, 단순한 배열 내의 요소를 찾을 때에는 indexOf() 를 사용하면 되지만, 찾아야하는 요소가 복잡할 경우, 또는 객체의 인덱스가 필요할 경우 사용.

  • reverse(): 배열의 순서를 반전. 첫 번째 요소는 마지막 요소가 되며 마지막 요소는 첫 번째 요소가 되는 메서드.

  • indexOf()의 return 값
    메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환

    -> 다른 분의 풀이를 보면 존재하지 않았을 경우의 조건을 빠르게 early return 해주었는데 return 값을 더 명확히 알고 응용하는 것 또한 중요하다는 것을 알게 되었다.



🌈 느낀 점

어느 순간부터 자꾸 기초적인 부분들을 놓치고 있다는 느낌을 강하게 받았다.
변수명 선언이나 let, const 사용에 있어서 더더욱.. 🥲
습관이라는 것이 굉장히 무섭다는 것을 알아서 코드 하나를 쓰더라도 한자한자 고민하고 생각하면서 적는 습관을 다시 들여야겠다는 생각이 들었다.
이래서 기록을 남기고 반복해서 복습하고 익히는 시간이 중요한 것 같다.
한 번 알게된 지식이여도 시간이 흐르면 언제든 까먹게되기 때문에..

참고 사이트) MDN

좋은 웹페이지 즐겨찾기