[Problem Solving] 가장 가까운 같은 글자

Sean·2022년 12월 28일
0

Problem Solving

목록 보기
6/130

문제

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

  • b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  • n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  • a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

통과한 코드

사용한 Method

아이디어

문자열 s를 순회하면서 다음과 같이 answer에 추가한다.

  1. indexOf 메소드는 파라미터로 넘어온 것에 대해서 해당 string에 포함되어 있는 첫 번째 것의 인덱스를 반환해준다.
    ex) 'banana'에서 indexOf('banana', 'a')를 하면 첫 번째 'a'의 인덱스인 1을 리턴.
    따라서, 이를 이용해서 현재 반복문을 돌고 있는 인덱스가 i일 때, 해당 글자의 첫 번째 인덱스가 i이면 문제 요구사항대로 -1을 넣어준다.
  2. lastIndexOf 메소드에 추가적인 파라미터로 찾는 글자에 추가적으로 fromIndex를 넣어줄 수 있는데, 이를 이용하면 fromIndex로부터 역순으로 해당 파라미터의 인덱스를 찾아준다. 해당 파라미터를 찾지 못하면 -1을 반환한다.
    따라서, 이를 이용해서 현재 반복문을 돌고 있는 인덱스 i보다 하나 적은 i-1에서 역순으로 찾아준 것이 자기랑 가장 가까운 같은 글자가 되며, 그것을 answer에 저장해준다.
  3. 나머지 경우는 다 -1로 채워주면 된다.
function solution(s) {
    var answer = [];
    //문자열 s를 순회
    for(let i=0; i<s.length; i++) {
        if(s.indexOf(s[i]) == i) {
            answer[i] = -1;
        }
        else if(s.lastIndexOf(s[i], i-1) !== -1) {
            answer[i] = i- s.lastIndexOf(s[i], i-1);
        }
        else {
            answer[i] = -1;
        }
    }
    return answer;
}

더 깔끔한 코드

해당 코드는 다른 사람의 코드인데, 앞으로 나도 if-else보다는 삼항연산자를,
map을 이용할 수 있을 때는 반복문보다는 map 메소드를 애용해야겠다.

추가적으로, 스프레드 연산자를 잘 활용할 수 있도록 연습해야겠다.

const solution = (s) =>
  [...s].map((char, i) => {
    const count = s.slice(0, i).lastIndexOf(char);
    return count < 0 ? count : i - count;
  });
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글