String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예시
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
🥑 첫번째 접근 방법
/or(let i=0; i<arr.length; i++){
if(arr[i] === arr[i+1]){
arr.shift();
}
else{
arr.concat(arr[i], arr[i+1]);
}
return arr.toString();
}
🥑 두번째 풀이
const newArr = arr.filter((el, idx) => arr.indexOf(el)=== idx)
👉 filter를 써보고 싶었는데, 중복값을 삭제하는 것만 구현가능해서 다른 방법을 모색하기로 하였다.
🥑 세번째 풀이
조금더 논리적으로 접근하고자 로직트리를 작성해보았다.
- 배열의 인덱스 순서대로 첫번째 인덱스와 두번째 인덱스를 비교한다.
- 두 인덱스를 비교했는데 만약 같은 값(중복)이면 중복된 첫번째 인덱스 까지를 slice한다.
- 길이가 줄어든 배열을 다시 첫번째 부터 인덱스 비교를 시작한다.
- 다시 배열의 첫번째 인덱스와 두번쨰 인덱스를 비교한다.
- 만약 값이 같다면 2번을 다시 시행, 같이 다르면, 새로운 배열에 이 다른 값들을 담는다.
- 2~5번을 반복하는데, 이후에 다시 반복된 문자를 만날 경우, 그 때까지의 배열 길이 와 그전에 새로운 배열에 담았던 길이를 비교해서, 작업을 수행한 배열의 길이보다 새롭게 담은 배열의 길이가 더 길 경우, 새로운 배열을 교체한다.
- 이렇게 배열을 순회한다음, 기존 배열의 길이와 새로운 배열의 길이 중 더 큰 값을 출력한다.
function getLengthOfStr = str => {
let arr = [];
let newArr = [];
for (let i = 0; i < str.length; i++) {
let s = str.slice(i, i+1);
for (let j = 0; j < arr.length; j++) {
if (s === arr[j]) {
if (newArr.length < arr.length) {
newArr = arr.slice();
}
arr = arr.splice(j+1, arr.length);
break;
}
}
arr.push(ss);
}
return Math.max(arr.length, newArr.length);
}
📌 참고사항 : splice()와 slice의 차이점 _ slice는 원본배열을 수정하지 않고, splice는 원본배열을 수정한다.