function solution(s) {
let stack = [];
let ans = [];
for(let i = 0; i < s.length; i++){
if(!stack.includes(s[i])){
ans.push(-1);
stack.push(s[i]);
continue;
}
if(stack.includes(s[i])){
ans.push(stack.length - stack.lastIndexOf(s[i]));
stack.push(s[i]);
continue;
}
}
return ans;
}
방법은 다음과 같다.
스택이 있고, 그 곳에는 문자열이 하나씩 들어갈 것이다.
우선 스택을 확인한다. 현재 넣으려는 문자열이 존재하지 않는다면 -1
을 ans
에 넣는다.
그리고 스택에 그 문자열을 넣어준다.
그 뒤에 있는 코드가 실행되지 않도록 continue
처리도 해준다.
스택을 확인한다. 현재 넣으려는 문자열이 존재한다면
스택의 길이 - 스택 가장 위쪽에 있는 해당 문자열의 인덱스
를 ans
에 넣는다.
그리고 스택에 문자열을 넣어준다.
스택 가장 위쪽에 있는 해당 문자열의 인덱스는 가장 가까운 문자열을 찾기 위함이고,
그 것이 현재 넣으려는 문자열과 얼마나 떨어져 있는지를 보기 위해서 스택의 길이에서 인덱스를 뺀다.
for
대신 고차 함수를 사용한 풀이는 다음과 같다.
function solution(s) {
let stack = [];
let ans = [];
[...s].forEach((str) => {
if(!stack.includes(str)){
ans.push(-1);
}
if(stack.includes(str)){
ans.push(stack.length - stack.lastIndexOf(str));
}
stack.push(str);
})
return ans;
}