JavaScript/알고리즘

(JS) 알고리즘 - 서울에서 김서방 찾기

resolve() 2023. 6. 20. 23:12

✔ 문제 요약

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

 

       seoul                        return
["Jane", "Kim"]      "김서방은 1에 있다"

 

✔ 문제 접근

 특정 요소의 인덱스를 찾는 메서드 indexOf()를 사용해서 "Kim"을 변수에 할당하면 되지 않을까? 

 

✔ 문제 풀이

 
  function solution(seoul) {
        const x = seoul.indexOf("Kim")
        return `김서방은 ${x}에 있다`
        }

(1) arr.indexOf(element);

배열에서 element를 찾아 반환한다. 주의할 점은 첫번째 element만 반환하고, 만약 없으면 -1을 반환한다. 

"Kim"은 배열 seoul의 1번째에 있으므로  1을 반환한다. 

(2) 이렇게 찾아낸 "Kim"을 변수 x에 할당한다.

(3) 백틱과 ${]을 사용해서 간단하게 문자열로 만든다. 

(4) 결과 : 김서방은 1에 있다. 

 

✔ 더 생각해볼 것

간단한 문제여서 다른 문제를 직접 생각해보기로 했다. 

 

(1) 앞서 말했듯이 indexOf(0메서드는 간편하지만, 중복된 요소까지 모두 찾아낼 수는 없다. 

만약 문제에서 배열 seoul이 ["Jane", "Kim", "Kim", "Kim"] 이었다고 해도, x에는 1만 할당되었을 것이다.

return ["Kim","Kim","Kim"]을 얻고싶다면 어떻게 해야할까?

(2) filter() 메서드를 사용하면 "Kim"들을 모두 추출할 수 있다. 

const seoul = ["Jane", "Kim", "Kim", "Kim"];
const Kims = seoul.filter((element) => element === "Kim");

 

 

(1) 만약에 배열에서 중복되는 값이 있고, 그 값을 1개씩 찾아내고 싶다면 어떻게 해야할까?

(2) filter()와 indexOf() 메서드를 사용해서 풀 수 있다. 위에서 설명했듯이 indexOf()는 첫번째 요소의 인덱스를 반환한다. 

filter는 이렇게 구한 첫번째 인덱스(고정)과 다음에 나타나는 인덱스를 비교하는 역할을 할 수 있다. 

(3) 첫번째 "Jane" [0]과 두번째 "Jane"[4]를 비교해서, 같지 않다는 건 "Jane"이 두번 이상 나왔다는 뜻이 된다.

즉, 중복되는 값이 된다. 

(4) array에서 중복되는 값을 1개씩 담은 새로운 배열 newArr이 완성되었다.  

    const array = ["Jane","Kim","Kim","Sarah","Jane"];
    const newArr = array.filter((element, index) => array.indexOf(element) !== index);
    console.log(newArr); // [ 'Kim', 'Jane' ]

 

(5) 위의 코드를 조금만 수정해서 반대로 만약에 배열에서 중복되는 값들을 제외하고 값을 1번씩만 찾아낼 수도 있다. 

  const array = ["Jane","Kim","Kim","Sarah","Jane"];
    const newArr = array.filter((element, index) => array.indexOf(element) === index);
    console.log(newArr); // [ 'Jane', 'Kim', 'Sarah' ]

indexOf로 구한 첫번째 요소의 인덱스와 filter의 인덱스가 같은 경우만 반환한다. 

즉, 중복된 값들을 제외한 새로운 배열을 만들 수 있다.