[js] 프로그래머스 가장 가까운 같은 글자

이명진·2023년 1월 2일
0

코드카타

목록 보기
54/69

문제 요약

문자가 주어지고 문자가 왼쪽에서 오른쪽으로 읽힌다.
문자에서 중복되는 글자가 있을 경우 가장 가까운 같은 글자가 얼마만큼 떨어져 있는지를 구하면 된다.

문제 풀이

일단 난이도 0 문제라서 처음 시도 과정 끝에 맞출수 있었다.
다만 아쉬운점이 리팩토링을 할수 있을것 같은데 어떻게 해야 할지 고민이 많이 되었다.

일단 내가 푼 풀이다.

function solution(s) {
    let answer = [];
    let que = [];
    for(let i=0; s.length>i;i++){
      if(!que.length || !que.includes(s[i])){
        que.push(s[i]);
        answer.push(-1)
      }else{
        let idx = que.reverse().findIndex(x=>{
          return x==s[i]
        });
        
        que.reverse().push(s[i]);
        answer.push(idx+1)
      }
    }
    return answer;
}

스택과 큐를 생각해서 문제를 풀었다. 만약 글자가 안겹치면 que배열에 넣어주고 겹치면

글자를 찾아야 하는데 역순으로 구해야 하니 reverse함수를 활용하여 배열을 뒤집어 주고
다시 원본 배열을 원 상태로 돌려야 하니 다시 뒤집어 주었다.

revser함수를 두번사용했는데.. 이부분이 마음에 걸린다.

그리고 각 idx를 뽑아줘서 배열에 저장해둔다.
idx는 0부터 계산하니까 1를 더해서 넣어주면 완성.

다른 사람의 풀이

다 비슷비슷하게 푼것 같아서 제일 깔끔한것으로 가져왔다.

const solution = (s) =>
  [...s].map((char, i) => {
    const count = s.slice(0, i).lastIndexOf(char);
    return count < 0 ? count : i - count;
  });

map으로 순서를 돌린다음에 배열을 자른뒤에 자른 만큼 lastIndexOf함수를 활용했다.

알아보니 lastIndexOf 함수가 역순으로 원하는 것을 찾는 함수였다.
이런 함수가 있을까 고민하면서 reverse를 사용한것인데 있었다..

lastIndexOf()

함수를 실행하면 lastIndexOf(value,fromIndex) value 값을 찾게 된다.
문자도 찾을수 있다.
왼쪽에서 오른쪽으로 인덱스를 매긴다. (기존과 동일)

매개변수로 optional을 가지고 있는데 fromIndex 이다.
fromIndex는 탐색의 시작점으로 사용할 인덱스이다.

내가 푼풀이를 리팩토링 하자면 이렇다.

function solution(s) {
    let answer = [];
    let que = [];
    for(let i=0; s.length>i;i++){
      if(!que.length || !que.includes(s[i])){
        que.push(s[i]);
        answer.push(-1)
      }else{
        let idx = que.lastIndexOf(s[i])
  
        que.push(s[i]);
        answer.push(i-idx)
      }
    }
    return answer;

}

간단하게 중복이 있을 경우만 리팩토링 한 예시지만
값이 없을때는 lastIndexOf가 -1를 뱉기 때문에 if else 구문이 필요가 없을 것이다.
결국 리팩토링 하면 다른사람의 풀이처럼 간략하게 리팩토링된다.

마무리

오늘은 새롭게 lastIndexOf 함수에 대해서 알아봤다. 역시 내장함수를 활용하니 결과가 훨씬 좋아졌다. 성능면에서도 빨라졌다. 공부를 꾸준히 해야 겠다고 오늘도 다짐하는 날이었다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글