Algorithm - CodeKata #03

Sangho Moon·2020년 9월 3일
0

Algorithm

목록 보기
22/37
post-thumbnail
post-custom-banner

1. Question

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

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

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

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

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


2. Try & Answer

너무 어려웠다...... 약 20분 정도 생각해보았지만 손도 못대고 구글링으로 정답을 찾아버렸다.

그래서 우선 정답을 이해하는 것에 초점을 맞췄다.

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

console.log(getLengthOfStr("abcabcabc")); // 3
console.log(getLengthOfStr("aaaaaaa")); // 1
console.log(getLengthOfStr("sttr")); // 2
console.log(getLengthOfStr("aabbbbccccc")); // 2

  • str = "sttr" 일 때,
  1. sliceStr 이라는 빈 배열을 생성한다.

  2. lastStr 이라는 변수를 선언하고 그 값을 0으로 할당한다.

  3. 입력받은 str인자의 길이만큼 for문을 돌린다.

  4. 만약 sliceStr 배열에 str[i]가 포함되어있지 않다면 sliceStr에 str[i]를 포함시킨다.

    ex1) str = "sttr" 라면, i = 0 일 때 sliceStr에 "s"가 포함된다.

    ex2) str = "sttr" 라면, i = 1 일 때 sliceStr에 "t"가 포함된다.

  5. 그리고 만약 lastStr이 sliceStr의 길이보다 작다면, lastStr = sliceStr의 길이와 같게 한다.

    ex1) i = 0 일 때 sliceStr = [ 's' ] 이므로 lastStr = 1 이 된다.

    ex2) i = 1 일 때 sliceStr = [ 's', 't' ] 이므로 lastStr = 2 가 된다.

  6. 그렇지 않다면 (만약 4번의 조건에 부합되지 않는다면)

    ex1) i = 2 일 때 sliceStr에 't'가 이미 포함되어 있으므로 이 경우에 해당한다.

  7. sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1); 에서

    str[2] = t 이고, sliceStr.indexOf(t) = 1 이며, sliceStr.slice(1+1) 은 빈 배열이 된다.

    즉, 기존의 sliceStr에 푸쉬되었던 요소들이 없어지고 새로운 배열로 다시 시작하는 것이다.

  8. 그리고 sliceStr에 str[2]를 push하면, sliceStr = [ 't' ] 가 된다.

  9. 그 다음에 i = 3 일 때 다시 for 문이 돌아가면 sliceStr = [ 't', 'r' ] 인 상태로 for 문이 끝나고

    lastStr = 2가 된다.


Ref.

profile
Front-end developer
post-custom-banner

0개의 댓글