코딩테스트

[JS] 연습문제 > 가장 가까운 같은 글자

차차한 2024. 9. 10. 14:43

 

문제풀이 도전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]