function solution(s) {
let answer = []; // 빈배열
let temp = []; // 임시배열
// s : for문 돌리기
// if else or 삼항연산자로
// push로 배열 안에 넣기
// includes로 포함된 문자 찾기
// console.log(answer); //빈배열
// console.log(s); //문자가 들어가 있다
for(let i = 0; i < s.length; i++){ // s의 길이를 구하기 위해 for문으로 string을 반복을 돌린다.
// answer.push(s[i]); // ex) s의 i 순번째의 글자를 answer에 넣는다.
if(!temp.includes(s[i])){ // 만약 temp에 s의 i순번째 글짜가 포함되어 있지 않으면
answer.push(-1); // answer에 -1을 대입한다.
temp.push(s[i]); // s의 i순번째 글자를 temp에 넣는다.
}
else if(temp.includes(s[i])){ // 또 만약 temp에 s의 i순번째 글짜가 포함되어 있으면
answer.push(i - temp.lastIndexOf(s[i]));
// temp안에 s의 i순번째 글자를 뒤에서 부터 검색한 후, i에서 빼준 값을 answer안에 넣는다.
// 현재 문자열에서 s[i]를 비교할 때 i의 자리에 있기 떄문에 i - temp.lastIndexOf(s[i])를 사용해 가장 마지막에 있는 같은 단어를 찾기 위함이다.
// ex) banana라면, a가 1,3에 위치해 있다. 마지막에 있는 a는 이전에 나온 a와 비교가 필요하기 때문에 숫자 1이 아닌 3과 비교해야한다.
temp.push(s[i]);
}
}
return answer;
}
lastIndexOf(검색할 값, 시작위치)
: 끝에서부터 검색할 값을 찾기 시작
lastIndexOf는 말 그대로 검색을 앞에서가 아니라 뒤에서부터 찾기 시작함 여기서도 시작위치가 생략이 되었다고 하면 맨 끝에서부터 검색을 시작
(출처 : String.prototype.lastIndexOf())
(출처 : [javascript] indexOf ,lastIndexOf - 부분 문자열 위치 검색)
const solution = (s) =>
//console.log([...s]); // [ 'b', 'a', 'n', 'a', 'n', 'a' ]
[...s].map((char, i) => {
// spread operator(스프레드 연산자)를 통해 기존 문자열을 복사한 후 map으로 반복을 돌린다.
//console.log(`map : ${i} ` + char );
/* 순번, 글자 확인한다.
[ 'f', 'o', 'o', 'b', 'a', 'r' ]
map : 0 f
map : 1 o
map : 2 o
map : 3 b
map : 4 a
map : 5 r
*/
const count = s.slice(0, i).lastIndexOf(char);
// s를 첫 글자부터 i번째까지 자른 글자를 char의 글자를 끝에서 부터 검색한다.
return count < 0 ? count : i - count;
// count가 0보다 크면 count를 반환하고 아니면 순서에서 count를 뺀값을 내보낸다
});
[...s]
: 배열, 객체의 전체 또는 일부를 다른 배열로 얕게 복사한다.
(출처 : 스프레드 연산자(spread operator))
(출처 : spread-operator)
arr.slice([start[, end]])
: 배열의 특정 범위의 요소를 잘라내어 추출한 결과를 새로운 배열로 반환한다. 배열의 원하는 범위의 요소를 추출 할 수 있다.
원본 배열은 바뀌지 않는다.
start
arr.slice([0[, end]]) :추출을 시작할 0부터 시작하는 인덱스를 지정한다.
arr.slice([[, end]]) : 생략하면 기본값으로 0이 사용된다.
arr.slice([-0[, end]]) : 음수 값을 사용할 수 있으며, 이 경우 배열의 끝에서부터 역으로 카운트된다.
추출한 배열의 길이(arr.length)보다 크거나 같으면 아무것도 추출되지 않는다.
end
arr.slice([[, 5]]) : 추출을 끝낼 인덱스를 지정하는데, slice()는 지정한 이 end 인덱스를 제외하고 추출한다.
arr.slice(arr.slice([[]]) : 생략하면 기본값으로 0이 사용된다.
) : 생략하면 배열의 끝까지 추출한다.
arr.slice([[, -5]]) : 음수 값을 사용할 수 있으며, 이 경우 배열의 끝에서부터 역으로 카운트 된다.
추출한 배열의 길이(arr.length)보다 크거나 같으면 배열의 끝까지 추출한다.
(출처 : 자바스크립트 배열 slice() 함수 – 개념 정리 및 사용 예제)
(출처 : Array.prototype.slice())
https://devjhs.tistory.com/79