반응형
문제
풀이
내 풀이
function solution(s) {
return [...s].map((text, idx) => {
const char = s.slice(0, idx + 1);
if(char.indexOf(text) === char.lastIndexOf(text)) return -1;
return idx - s.slice(0, idx).lastIndexOf(text);
})
}
- 반복문을 돌리고,
- 문자열에서 index만큼 문자열의 앞부분을 자른다.
- 자른 문자열에서 해당 문자열이 한 번 있으면 -1를 반환.
- indexOf와 lastIndexOf가 동일하면, 한 번만 있다는 의미
- 그게 아니라면, index에서 index를 포함하지 않는, 앞까지 자른 문자열에서 마지막에 위치한(lastIndexOf) 인덱스의 값을 뺀다. 그 값이 바로 마지막에 나온 문자열과 현재 인덱스 위치와의 거리이다.
다른 풀이 - 1
function solution(s) {
const hash = {};
return [...s].map((v,i)=>{
let result = hash[v] !== undefined ? i - hash[v] : -1;
hash[v] = i;
return result;
});
}
알파벳의 위치(인덱스)를 담은 객체를 이용한 풀이다.
객체에 알파벳이 key인 값이 없으면 -1를 반환하고,
있다면 (현재 인덱스 - 객체의 value) 를 반환한 후, 해당 인덱스를 객체의 value로 업데이트한다.
다른 풀이 - 2
const solution = (s) =>
[...s].map((char, i) => {
const count = s.slice(0, i).lastIndexOf(char);
return count < 0 ? count : i - count;
});
인덱스 앞부분까지 문자열을 자르고, lastIndexOf를 본다.
존재하지 않는다면 count는 -1를 담고 있고, 존재한다면 마지막으로 나타난 index를 담고 있다.
따라서 return count === -1 ? count : i - count 로도 나타낼 수 있겠다.
반응형
'CS > 알고리즘' 카테고리의 다른 글
[230419] 멀리 뛰기 (0) | 2023.04.19 |
---|---|
[230417] 귤 고르기 (0) | 2023.04.16 |
[230416] 푸드 파이트 대회 (0) | 2023.04.16 |
[230416] 점프와 순간 이동 (0) | 2023.04.16 |
[230414] N개의 최소공배수 (0) | 2023.04.14 |