코드 카타 Day 1 / 문제 3
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
str = "abcddddjklmnopddf" 은 8 => 'djklmnop' 가 제일 길기 떄문
안녕 ~ !
이 문제는 문자열을 입력 받아서 그 문자열 중에 중복이 없고, 연속적으로 ! 가장 긴 단어의 ! 길이를 반환하는 함수를 만드는 문제.
처음에는 이중 포문을 사용해서 문자 단위로 비교해서 풀려고 했지만, 문자 단위로 비교해서 풀려고 하다보니,
첫번째 포문 i 에서 도는 첫번째 문자열과 별개로 다른 중복 문자열이 발생하면 (ex) "abcccda" 이면) a와 중복을 찾는 중 c가 중복되어, 포문을 멈춰야하는데 그게 안되는 것 같아서 중단했다.
동기의 도움을 받아, 배열에 저장하는 방법으로 풀이.
빈 배열부터 한 문자열씩 indexOf로 중복을 확인하고 없으면 배열에 추가한다
그 배열의 indexOf가 성립하면(중복 발견) 중복된 알파벳 중, 첫번째 알파벳의 위치 (ex) "abcdabc" 이면 첫번째 a)를 slice하여
다시 중복되지 않게 배열을 만들어서 반복. 포문 내에서 다른 조건문으로 배열 길이를 topLength에 저장하는 방법으로 풀었다 !
문제 풀이
const getLengthOfStr = (str) => {
let topLength = 0; //최대길이를 저장하는 변수, 초기값 0
let arr = [] //연속된 알파벳을 저장하는 배열, 초기값 빈 배열
for(i=0;i<str.length;i++){ //배열 순회
if(arr.indexOf(str[i]) == -1){ //배열에 입력값 알파벳이 없으면
arr.push(str[i]); //배열에 삽입
}
else{ //같은 알파벳이 indexOf에서 발견되었을 때
arr = arr.slice(arr.indexOf(str[i])+1); //연속된 알파벳 2개 중 앞 알파벳을 삭제
arr.push(str[i]); //뒤 알파벳을 저장하여 중복없이 연속되게 계속 카운트
}
if(topLength < arr.length){ //배열 삽입 시, 연속된 알파벳의 최대길이를 저장
topLength = arr.length
}
}
return topLength;
};
str = "hasangwon";
console.log(getLengthOfStr(str));
이해를 돕기 위해 주석을 첨부했다 ~ !
'Computer Science > Algorithm' 카테고리의 다른 글
Full text search를 위한 검색 array 알고리즘 (0) | 2022.10.24 |
---|
댓글