글 작성자: 개발자 올라프

문제

 

String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.

str : 텍스트를 반환하는데 중복되지 않은 알파벳 길이(숫자 반환)

 

예를 들어, str = "abcabcabc"라면, return은 3이다. 왜냐하면 'abc'가 가장 길기 때문이다.

str = "aaaaa" retrun은 1이다. 왜냐하면 'a'가 가장 길기 때문이다.

str = "sttrg" retrun은 3이다. 왜냐하면 'trg'가 가장 길기 때문이다.

 

풀이

 

얼추  for문으로 문자열 하나하나를 비교하며 slice() 메서드를 사용하는 것까지는 접근했지만 도저히 해결할 수 없었다. 그래서 구글에 모범 답안을 가져와서 이해하고 정리하는 시간을 가졌다.

const getLengthOfStr = str => {
	let sliceStr = [];
    let resultStr = 0;
    
    for(let i=0; i<str.length; i++) {
    	if(sliceStr.indexOf(str[i]) === -1) {
        	sliceStr.push(str[i]);
            if(resultStr < sliceStr.length) {
            	resultStr = sliceStr.length;
            }
        } else {
        	sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1);
            sliceStr.push(str[i])
        }
    }
    return resultStr;
}

String.prototype.indexOf() : 호출한 String 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환한다. 일치하는 값이 없으면 -1을 반환한다.

String.prototype.slice() : 문자열의 일부를 추출하면서 새로운 문자열을 반환한다.

 

전체적인 흐름은 str를 한 글자씩 불러오면서 만약에 sliceStr에 없는 알파벳이라면 sliceStr에 push()하고, resultStr보다 현재 sliceStr의 길이가 크다면 resultStr에 그 길이 값을 넣는다. 만약 한 글자씩 불러오면서 sliceStr에 있는 알파벳이 나온다면 sliceStr 값을 기존 sliceStr 값에서 해당 알파벳을 찾아 중복된 첫 알파벳 부분까지 제거한 나머지 값을 할당한다.\