문제
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
내 Flow
- String형을 배열로 만들어 쪼갠다.
- for문으로 같은 문자가 나오면 그 앞까지의 배열을 저장한다.
- 그 뒤부터 또 for문을 돌리고 또 같은 문자가 나오면 배열을 2에서 나온 배열의 length와 비교해서 더 큰 것을 반환한다.
- indexOf가 찾는 문자열이 없으면 -1을 리턴하므로 값이 -1이면 for문이 멈춰야 한다.
💬 문제를 봤을 때 문장으로 풀어쓸 수는 있겠는데 어떤 메소드를 사용해야 하는지는 어렵다...
결국 구글링해서 다른 분의 풀이를 보고 이해하는 걸로 족했다. 코드카타 둘째날부터 이런 난이도는 너무한 거 아니냐고요😥
풀이
const getLengthOfStr = str => {
let sliceStr = [];
let result = 0;
for (let i = 0 ; i < str.length ; i++) {
if (sliceStr.indexOf(str[i]) === -1) {
sliceStr.push(str[i]);
if (result < sliceStr.length) {
result = sliceStr.length
}
}
else {
sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1)
sliceStr.push(str[i])
}
}
return result;
}
- 빈 배열을 만든다.
- 배열의 개수를 비교할 값을 우선 0으로 값을 준다.
- 빈 배열에서 인자로 받은 문자를 indexOf를 사용하여 찾고, 없을 경우 빈 배열에 넣는다.
- 0으로 준 result 값과 배열의 개수를 비교하여 배열의 개수가 더 클 경우 result 값에 그 개수를 값으로 넣는다.
- 문자열에서 중복된 문자가 나오면 3번의 조건이 성립하지 않아 else문이 작동한다.
- 중복되는 요소가 발견되면 원래 배열에 있던 중복되는 배열 이후의 값은 보존해야한다.
- indexOf를 통해 중복되는 요소의 위치를 알아내고 +1 을 추가하여 slice()메소드가 중복되는 요소를 포함한 그 전의 요소들만 삭제 할 수 있도록 구현한다.
참고
'알고리즘 > 코드카타' 카테고리의 다른 글
Week2 - Day3 (Javascript) (0) | 2022.07.14 |
---|---|
Week2 - Day2 (Javascript) (0) | 2022.07.14 |
Week2 - Day1 (Javascript) (0) | 2022.07.11 |
Week1 - Day5 (Javascript) (0) | 2022.07.07 |
Week1 - Day2 (Javascript) (0) | 2022.07.05 |