[JS] 연습문제 > 가장 가까운 같은 글자
문제풀이 도전1.
먼저 문자열을 배열로 만들고 배열의 길이만큼 반복을 돌며 indexOf로 값을 찾으면 되는 문제라고 생각했다.
그런데 문제를 풀다보니 banana에서 마지막 a는 글자 앞에 두 번의 a가 있었고
indexOf로 찾으면 맨 처음 a의 인덱스만 찾아냈다.
테스트 1에서 마지막 a의 값이 틀렸다
문제풀이 도전2.
그래서 이 방법으로는 문제를 풀 수 없어서 slice를 이용해 문자열 배열을 0부터 해당 값이 있는 곳까지 자르고
그 새로운 배열을 reverse()로 해서 가까운 인덱스를 찾으려 했는데 그러면 원래 순서의 인덱스를 찾을 수 없었다.
문제풀이 정답.
찾아보니 lastIndexOf라는 메소드가 있더라
가장 마지막 인덱스를 체크하는 메소드여서 먼저 slice로 새로운 배열(newArr)을 만든 다음에
lastIndexOf로 인덱스 위치를 찾았다.
처음 쓰는 글자라면 배열에 값이 없으니 -1을 리턴하고
값이 있으면 원래 배열(arr)보다 몇 칸 앞인지를 찾는 거라 i - idx로 위치를 구해줬다.
function solution(s) {
var answer = [];
var arr = [...s];
for(let i = 0; i < arr.length; i++){
var newArr = arr.slice(0, i);
var idx = newArr.lastIndexOf(arr[i]);
if(idx == -1){
answer.push(idx);
}else{
answer.push(i - idx);
}
}
return answer;
}

첫 글자 b는 -1을 리턴
a와 n도 처음 쓰이기 때문에 newArr에 값이 없어 -1 리턴
answer = [-1, -1, -1]
4번째 글자 a와 5번째 글자 n은 각 위치에 있는 idx인 1과 2를 리턴
이때 문제에서 요구하는 답은 인덱스가 아닌 n번째 글자보다 몇 칸 앞에 위치했는지를 요구하는 거라 i에서 idx를 빼 몇 칸 앞인지를 구한다
그러면 3-1, 4-2를 해서 둘 다 2를 리턴
answer = [-1, -1, -1, 2, 2]
마지막 글자 a는 newArr의 1번 3번 인덱스에 값이 있는데 lastIndexOf로 가장 마지막 인덱스를 리턴해주니 3번 인덱스의 a를 체크
i - idx를 해주면 5-3으로 2를 리턴
answer = [ -1, -1, -1, 2, 2, 2]