문제
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
const getLengthOfStr = str => {
// 아래 코드를 작성해주세요.
//string을 한글자씩 쪼갠다 & 새로운 배열을 만든다.
let splitStr = str.split(''); //['a','b','c','a','b','c']
let newArray = []
//반복문을 돌려서 str에서 같은값이 아니라면, 새로운 배열에 넣는다.
for(let i=0; i <splitStr.length; i++) {
if(splitStr[i] !== splitStr[i+1]){
newArray.push(splitStr[i])
//새로운 배열을 반복문을 돌려서, 새로운 배열내 값과 string의 다음 값이 같다면,
새로운 배열의 길이를 반환한다.
for(let j=0; j <newArray.length; j++) {
if(newArray[j] === splitStr[i+1]){
return newArray.length;
}
}
}
// 만약 str[i]와 str[i+1]의 값이 같다면, i+1까지에 있는 값까지의 string을 잘라 반환한다.
else {
return splitStr.slice(0, i+1).length
}
}
여기서는 값이 같다면 그 앞까지의 값만 반환한다는 문제가 생겨버린다.
혹은 배열에 들어간 값만 반환된다는 한계가 생긴다.
이를 해결하려면, 문자열 자체를 배열에 넣는 것이 아닌 문자열의 길이를 반환하는 것에 포커스를 둬야한다.
const getLengthOfStr = str => {
//빈 배열과 빈 문자열을 선언한다.
let arr = [];
let newStr = '';
//반복문을 선언하여 str에 있는 값 하나하나를 새로운 스트링에 담는다.
//새로운 스트링에 str[i]의 값이 있다면
//새로운 스트링은 그 값을 가진 index+1로 쪼개 선언한다.
for (let i in str) {
if (newStr.includes(str[i])) {
newStr = newStr.slice(newStr.indexOf(str[i]) + 1);
} else if(str.length === 0) {
return 0
}
newStr += str[i];
//배열에 newStr의 모든 길이를 넣는다.
arr.push(newStr.length);
}
//배열에 있는 값 중에 가장 큰 값을 빼온다.
return Math.max(...arr);
}
console.log(getLengthOfStr('asdfgaedfadsf'))
해당 답안도 현재 str이 빈문자열일 때, 0의 값을 반환하지 않아 문제가 생긴다..ㅎㅎ
이건 주말에 해결해보기!