(JS) 알고리즘 - 서울에서 김서방 찾기
✔ 문제 요약
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
seoul return
["Jane", "Kim"] "김서방은 1에 있다"
✔ 문제 접근
특정 요소의 인덱스를 찾는 메서드 indexOf()를 사용해서 "Kim"을 변수에 할당하면 되지 않을까?
✔ 문제 풀이
(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이 완성되었다.
(5) 위의 코드를 조금만 수정해서 반대로 만약에 배열에서 중복되는 값들을 제외하고 값을 1번씩만 찾아낼 수도 있다.
indexOf로 구한 첫번째 요소의 인덱스와 filter의 인덱스가 같은 경우만 반환한다.
즉, 중복된 값들을 제외한 새로운 배열을 만들 수 있다.