문자열 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]가 됩니다.
function solution(s) {
//정답을 저장하는 배열
var answer = [];
//이미 등장한 문자열을 기록하는 배열
let chk = [];
for(let i=0; i<s.length; i++){
if(!chk.includes(s[i])){
answer.push(-1)
chk.push(s[i])
}else if(chk.includes(s[i])){
//있으면 가장 최근에 나온 같은 문자와의 거리를 비교
answer.push(i-chk.lastIndexOf(s[i]))
chk.push(s[i])
}
}
return answer;
}
answer배열에는 정답을 저장하고 chk배열에서는 최근에 이 글자가 나왔었나를 확인하는 배열이다
문자열이 끝날때까지 for문을 돌려 준 후.
만약에 chk배열이 s[i]를 포함하고 있지 않다면 answer배열에 -1을 넣어준다.
그런 후에 chk배열에 s[i] 를 넣어서 초기화를 시켜준다
만약에 chk배열 안에서 똑같은 글자를 가지고 있다면
answer에 최근에 나온 같은 문자와의 거리를 비교하여 answer 배열안에 넣어준다.
그리고 chk배열을 다시 초기화 해준다.
세상에는 정말 천재들이 많다..