[프로그래머스][JS] 가장 가까운 같은 글자
https://school.programmers.co.kr/learn/courses/30/lessons/142086
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 과정
function solution(s) {
var answer = [];
let str = []
for (let i = 0; i < s.length; i++){
if (!str.includes(s[i])){
str.push(s[i])
answer.push(-1)
}else{ // 이미 str 배열에 같은 요소가 존재하는 경우
for (let j = str.length - 1; j >= 0; j--){ // str배열을 거꾸로 순회
if (s[i] === str[j]){
answer.push(i - j) // 현재 Push될 요소의 인덱스 - 가장 가까운 요소의 인덱스
str.push(str[j])
break // 가장 가까운 값을 찾으면 반복 중단
}
}
}
}
return answer;
}
s = 'banana'이라고 가정할 때
str = ['b', 'a', 'n', 'a', 'n']까지 push가 완료되었을 때 str 배열에 해당 요소가 없을 경우에는 간단히 -1만 push 하면 되지만
다음 str에 push될 요소가 'a'이면 이미 str배열에 'a'가 두 개가 존재하고 현재 push 될 요소(s [i])까지 총 3개가 되는데 이때, 가장 가까운 요소의 인덱스를 찾아야 한다. indexOf 메서드는 처음부터 인덱스를 순회하여 찾아내기 때문에, 반복문을 돌려 배열의 마지막부터 순회하여 가장 가까운 인덱스(j)를 찾아야 한다. 가장 가까운 인덱스를 찾았다면 break를 해서 반복을 멈춰야 한다.
1. str 배열에 해당 요소가 없는 경우 (if) → answer 배열에 -1을 push
2. str 배열에 해당 요소가 이미 존재하는 경우 (else) → 해당 요소와 같으면서 가장 가까운 요소를 찾기 위해 str배열을 거꾸로 순회한다
해당 요소의 인덱스 i와 str배열을 거꾸로 순회하면서 찾은 인덱스 j를 뺀 값을 answer 배열에 push한다.
리뷰
lastIndexOf 메서드를 자주 사용하는 게 아니다 보니까 생각이 안 났는데,
for문으로 배열 거꾸로 순회하는 번거로움보다 마지막 인덱스를 찾는 lastIndexOf 메서드를 사용하면 더 간단하게 해결할 수 있다.
function solution(s) {
var answer = [];
let str = []
for (let i = 0; i < s.length; i++){
if (!str.includes(s[i])){
str.push(s[i])
answer.push(-1)
}else{ // 이미 str 배열에 같은 요소가 존재하는 경우
answer.push(i - str.lastIndexOf(s[i]))
str.push(s[i])
}
}
return answer;
}