문자열 s
가 주어졌을 때, s
의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.예를 들어, s
="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s
이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
s
의 길이 ≤ 10,000s
은 영어 소문자로만 이루어져 있습니다.s | result |
---|---|
"banana" | [-1, -1, -1, 2, 2, 2] |
"foobar" | [-1, -1, 1, -1, -1, -1] |
입출력 예 #1지문과 같습니다.
입출력 예 #2설명 생략
💡 문제풀이 과정
- 답안 1번: 새로운
array
를 하나 추가로 만들고 문자열s
를 배열 형태로 바꾸어map()
함수를 사용하였다. 조건문에서 빈 array에includes()
메소드를 사용하여 값을 탐색하고 찾을 수 없는 경우-1
을 answer 배열에push()
해준다 또한 빈 array에 배열화된 문자열들을push()
해준다.- 다음으로
array
에s
의 배열 값들이 포함되어 있는 경우, 가까운 같은 글자 체크는array.length
에서array.lastIndexOf(value)
를 빼준다.
lastIndexOf()
메소드는 주어진 값과 일치하는 부분을fromIndex
로부터 역순으로 탐색하여, 최초로 마주치는 인덱스를 반환한다. 일치하는 부분을 찾을 수 없으면-1
을 반환한다.str.lastIndexOf(searchValue, fromIndex?)
- 답안 2번의 경우 다른 사람의 풀이를 가져왔는데,
map()
과slice()
그리고lastIndexOf()
를 이용하여 풀이하였다.
✅ 답안 #1
function solution(s) {
let answer = [];
let arr = [];
[...s].map((v) => {
if (!arr.includes(v)) {
answer.push(-1);
arr.push(v);
} else {
answer.push(arr.length - arr.lastIndexOf(v));
arr.push(v);
}
});
return answer;
}
✅ 답안 #2
const solution = (s) =>
[...s].map((char, i) => {
const count = s.slice(0, i).lastIndexOf(char);
return count < 0 ? count : i - count;
});