function getLengthOfStr(s) {
    let strArr = [];
    let strArr2 = [];
    for (let i = 0; i < s.length; i++) {
        let ss = s.slice(i, i+1);
        for (let j = 0; j < strArr.length; j++) {
            if (ss === strArr[j]) {
                if (strArr2.length < strArr.length) {
                    strArr2 = strArr.slice();
                }
                strArr = strArr.splice(j+1);

                break;
            }
        }

        strArr.push(ss);

    }
    
    return Math.max(strArr.length, strArr2.length);
}

 

문제.

 

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

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

예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문

str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문

str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문

 

 

해설.

console.log(getLengthOfStr('sttrg'))를 예시로 들어보자.

 

우선, 두 개의 배열(strArr, strArr2)을 만들어 주자. 

우리는 중복된 문자('t')를 기준으로 앞의 한 배열에는 'st'를 남은 한 배열에는 'trg'를 넣는게 목표다.

 

문자열 sttrg를 for문에 넣었다.

 

그리고 변수 ss에  slice(i,i+1)를 통해 각 문자열을 하나씩 넣게 하였다.

  ex) i =0일 경우/  s.slice(0,1)은 's'문자를 말한다.

 

그 하나하나의 문자를 strArr.push(ss)를 통해 배열 strArr에 넣었다.

 

 

단, push를 하기 전에 strArr을 참조하는 for문을 넣었다.

왜냐하면 문자를 push하기 전에 strArr에서 중복되는 문자가 있는지 확인해야 하기 때문이다.

 

그것을 만들기 위해서 for문 안에 if(ss === strArr[j]) 이라는 조건을 넣어준다. 

그렇다면 중복되는 문자를 발견한다면 우리는 어떻게 하면 좋을까?

 

중복문자를 발견한다면, 발견된 문자의 위치를 기준으로 앞의 내용을 새로운 배열(strArr2)에 담아버리고 

원래 있던 배열을 빈배열로 만들어버리면 된다!

 

그 후에 다시 strArr.push(ss);를 통해 뒷 문자열을 받으면 되는 것이다.

 

그래서 strArr2 = strArr.slice();를 통해 앞의 문자를 담은 배열을 새로 만들고 (slice는 새로운 배열을 만드는 것이다. 유의하자!)

 

strArr= strArr.splice(j+1)을 통해서 strArr을 아무것도 없는 새로운 빈 배열로 만들어버리는 것이다.(splice역시 새로운 배열을 만든다.)

 

말만으로는 헷갈리는 구체적인 과정을 적어보자.

....................................................................................................................................................................................

strArr= ['s','t']이고

 

i =2가 들어갈 때

ss = s.slice(2,3)  //(ss = 't')

 

j=1에서 ss === strArr[1]  //(strArr = 't')

 

strArr2 = strArr.slice();  //(['s','t'])

 

strArr = strArr.splice(2) // [ ]

 

strArr.push(ss)

 

strArr = ['t']

....................................................................................................................................................................................

이렇게 하면 

 

모든 문자열이 다 돌았을 때

 

strArr = ['t', 'r' , 'g'] ;

strArr2 = ['s','t']

 

배열이 완성된다.

 

그후  Math.max(strArr.length, strArr2.length);를 통해 최대값을 구하면 값이 나온다!

 

 

 

그렇다면

 

strArr2.length < strArr.length

 

이 조건은 왜 있는 것일까? 

 

그 이유는 console.log(getLengthOfStr('abcdeabcabcd'))를 통해 설명할 수 있다.

 

strArr2.length < strArr.length없이 위의 로직을 쭉 실행한다고 해보자.

 

1) 첫번째 순환

abcde, abc

 

strArr = ['a','b','c']

 

strArr2=['a','b','c','d','e']

 

2)두번째 순환

 

strArr = ['a','b','c','d']

 

strArr2 = [a,b,c]

 

이렇게 나온다. 

 

여기서 Math.max(strArr.length, strArr2.length); 하면 값은 4가 나올 것이다.

 

하지만 본래 우리가 원하는 값은 제일 긴 길이인 abcde의 5가 나와야한다!

 

 

이러한 오류가 생기기 때문에

 

strArr2.length < strArr.length를 넣어야 하는 것이다.

 

strArr2의 길이가 strArr의 길이보다 작아야지만 그 값을 넣을 수 있도록 하면

 

당연히 그 값은 5가 나오는 것이다!

 

 

 

 

 

 

 

+ Recent posts