Code Kata
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
const getLengthOfStr = str => {
subStr = '';
max = 0;
for(let i = 0; i < str.length; i++) {
for(let j = i; j < str.length; j++) {
if(subStr.includes(str[j])) {
if(max < subStr.length) max = subStr.length;
subStr = '';
break;
}
else {
subStr += str[j];
if(j === str.length - 1){
if(max < subStr.length) max = subStr.length;
return max;
}
}
}
}
return max;
}
상위 for문은 문자열을 한 번 순회하기 위해서, 하위 for문은 접근한 문자의 중복 여부를 체크하기 위해서 중첩 for문으로 작성함
if 구문
현재까지 자른(중첩되지 않은) 문자열안에 현재 접근한 문자가 있다면,
현재까지 가장 긴 문자열의 길이를 저장해놓은 max
와 비교를 진행하고 값을 대입 또는 유지한다
그 후에 subStr은 초기화하고 break로 하위 for문을 탈출시킨다
else 구문
현재 접근한 문자가 subStr(현재까지 자른 문자열)
에 없다면 subStr
에 추가한다
if(j === str.length - 1)
?
위의 로직으론 중첩된 문자 없이 끝까지 도달할 경우 값을 저장할 수 없음으로 해당 조건문을 통해 중첩된 문자 없이 원본 문자열 끝에 도달 했을 경우
를 캐치한다
그리고 끝까지 중첩 문자가 없는 것을 확인했음으로 상위 for문으로 돌아가 순회를 할 필요가 없다
따라서 바로 max값을 return 해준다
마치며..
처음엔 순회를 하며 현재 문자와 중첩된 문자를 찾고, 중복된 문자의 인덱스를 통해 앞 뒤를 잘라 값을 구하는 로직을 구성했는데, 다음 같은 경우가 실패하였다
- "abcdefghcpisln"
이 경우는 문자 'c'가 중복된 위치에서 앞, 뒤로 자른 "abcdefgh", "cpisln" 보다 "defghcpisln" 같이 자르는게 중복 없는 가장 긴 문자열을 얻을 수 있었기에 계속 실패하였고 푸는데 오래 걸렸다 ㅠ 🥲
앞으론 너무 많은 작업을 한꺼번에 하려는 습관, 문제를 너무 대강 읽는 습관을 고쳐서 문제풀이를 잘 할 수 있도록 노력해야겠다