문자열 s
가 주어졌을 때, s
의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s
="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s
이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
문자열 s
를 순회하면서 다음과 같이 answer
에 추가한다.
indexOf
메소드는 파라미터로 넘어온 것에 대해서 해당 string에 포함되어 있는 첫 번째 것의 인덱스를 반환해준다.indexOf('banana', 'a')
를 하면 첫 번째 'a'의 인덱스인 1을 리턴.i
일 때, 해당 글자의 첫 번째 인덱스가 i
이면 문제 요구사항대로 -1을 넣어준다.lastIndexOf
메소드에 추가적인 파라미터로 찾는 글자에 추가적으로 fromIndex
를 넣어줄 수 있는데, 이를 이용하면 fromIndex
로부터 역순으로 해당 파라미터의 인덱스를 찾아준다. 해당 파라미터를 찾지 못하면 -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;
});