아래 코드로 문제 테케와 정확도 케이스를 모두 통과했다. 하지만 점수가 1점 ^ㅡ^
코드를 다시 보니 왠지 string 변수를 줄일 수 있을 것 같고 includes나 lastIndexOf 같은 메서드도 좀 덜 사용할 수 있을 것 같았다. 하지만 느낌만 오고 구체적인 방법이 생각이 안 남
function solution(s) {
let answer = [];
let string = '';
for (let i = 0; i < s.length; i++) {
if (!string.includes(s[i])) answer.push(-1);
else answer.push(i - string.lastIndexOf(s[i]));
string += s[i];
}
return answer;
}
다른 사람 풀이 중 고차함수 map과 객체(hash)를 활용한 첫 번째 코드가 좋았다.
문제의 답을 내기 위해 필요한 코드만 작성한 느낌이었다 👍
function solution(s) {
let hash = {}; // 최신 값을 넣을 빈 객체 생성
[...s].map((v, i) => {
let result = hash[v] === undefined ? -1 : i - hash[v];
hash[v] = i; // 객체의 v번째 값을 새로운 i로 교체
return result; // 여기서 각 차례의 연산 값인 result를 리턴하면 map이 새로운 전체 배열로 리턴
})
}
새로운 코드를 보며 다음 점들을 배웠다.
hash[v] === undefined
? 형태로 가능두 번째 항목인 '객체 값의 존재 여부 확인'은 key: value 형태인 객체의 property
를 확인하는 것과 동일했다. 관련 메서드가 있는 것 같아서 찾아보니 hasOwnProperty()
가 있었다.
undefined
부분을 바꿔서 실행하니 체감상 속도는 살짝 느려졌지만 이전보다 가독성은 올라갔다. 최종 코드 완성 👏
function solution(s) {
let hash = {};
return [...s].map((v, i) => {
let result = !hash.hasOwnProperty(v) ? -1 : i - hash[v];
hash[v] = i;
return result;
});
}