String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문
너무 어려웠다...... 약 20분 정도 생각해보았지만 손도 못대고 구글링으로 정답을 찾아버렸다.
그래서 우선 정답을 이해하는 것에 초점을 맞췄다.
function getLengthOfStr(str) {
let sliceStr = [];
let lastStr = 0;
for (let i = 0; i < str.length; i++) {
if (sliceStr.indexOf(str[i]) === -1) {
sliceStr.push(str[i]);
if (lastStr < sliceStr.length) {
lastStr = sliceStr.length;
}
} else {
sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1);
sliceStr.push(str[i]);
}
}
return lastStr;
}
console.log(getLengthOfStr("abcabcabc")); // 3
console.log(getLengthOfStr("aaaaaaa")); // 1
console.log(getLengthOfStr("sttr")); // 2
console.log(getLengthOfStr("aabbbbccccc")); // 2
sliceStr 이라는 빈 배열을 생성한다.
lastStr 이라는 변수를 선언하고 그 값을 0으로 할당한다.
입력받은 str인자의 길이만큼 for문을 돌린다.
만약 sliceStr 배열에 str[i]가 포함되어있지 않다면 sliceStr에 str[i]를 포함시킨다.
ex1) str = "sttr" 라면, i = 0 일 때 sliceStr에 "s"가 포함된다.
ex2) str = "sttr" 라면, i = 1 일 때 sliceStr에 "t"가 포함된다.
그리고 만약 lastStr이 sliceStr의 길이보다 작다면, lastStr = sliceStr의 길이와 같게 한다.
ex1) i = 0 일 때 sliceStr = [ 's' ] 이므로 lastStr = 1 이 된다.
ex2) i = 1 일 때 sliceStr = [ 's', 't' ] 이므로 lastStr = 2 가 된다.
그렇지 않다면 (만약 4번의 조건에 부합되지 않는다면)
ex1) i = 2 일 때 sliceStr에 't'가 이미 포함되어 있으므로 이 경우에 해당한다.
sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1); 에서
str[2] = t 이고, sliceStr.indexOf(t) = 1 이며, sliceStr.slice(1+1) 은 빈 배열이 된다.
즉, 기존의 sliceStr에 푸쉬되었던 요소들이 없어지고 새로운 배열로 다시 시작하는 것이다.
그리고 sliceStr에 str[2]를 push하면, sliceStr = [ 't' ] 가 된다.
그 다음에 i = 3 일 때 다시 for 문이 돌아가면 sliceStr = [ 't', 'r' ] 인 상태로 for 문이 끝나고
lastStr = 2가 된다.
Ref.