Code Kata #3 Get Length Of String

kich555·2021년 9월 19일
0

Code Kata

목록 보기
3/7
post-thumbnail

💻Get Length Of String

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

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

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

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

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

🔥갑작스러운 난이도 상승에 매우 당황했던 문제🔥

처음으로 문제를 읽자마자 로직이 나오지 않았다.
어떻게 접근해야할지 조차 난감했다.

☕첫번째 풀이

처음엔 split()을 활용하여 배열로 쪼갤 생각을 했지만, 그래선 답이 나오지 않았다. ( 못찾은거겠지...)
그래서 생각을 달리했다.

  const arr = [];  // 중복되지 않는 문자열들의 `길이`가 담길 빈 배열 생성
  let empty = ''; // 중복되지 않는 문자열이 담길 빈 문자열 생성
  if (str.length !== 0) { // 인자로 빈 문자열이 들어올 경우를 대비
    for (i in str) {
      if (empty.includes(str[i])) { // 만약 중복된 문자열을 만났을 경우
        empty = empty.slice(empty.indexOf(str[i]) + 1); // 문자열은 첫번째 중복값 (ex 'abcdefa' 중 첫'a') 다음 인덱스부터 끝까지 slice함 (ex 'abcdefa' -> 'bcdefa'
      }
      empty += str[i]; // 빈 문자열에 문자열을 한글자씩 채워넣기
      arr.push(empty.length); // 그렇게 만든 문자열의 길이를 배열에 채워넣기
    }
  }
   else {
    return 0 // 만약 인자로 들어온 문자열이 빈 문자열일 경우 0을 반환
  }
  return Math.max(...arr); // 배열의 요소 중 가장 큰 값을 반환
}

생각도 복잡했고, 식도 복잡했다.
가장 어려웠던 것은 한 문자열 안에 중복으로 존재할 문자가
1개가 아닐수도 있다는 부분이었다.
절대중복되는 문자가 없는 문자열 이 필요했다.

for (i in str) {
    if (empty.includes(str[i])) {
      empty = empty.slice(empty.indexOf(str[i]) + 1);
    }
    empty += str[i];
    arr.push(empty.length);
    }

조건문의 식과 반복문의 식이 유연하게 연결되어야 했다.

조건이 맞아야 반복문의 식을 실행해야 했기 때문에
반복문 안에 바로 조건문을 넣었다.

💡어쩌다 보니 당초 예상과는 반대로 반복이 없는 문자열을 찾는 식 자체는 형변환 없이 문자열로만 해결할 수 있었다.💡

처음부터 위 식에서 리팩토링을 진행한다면, 바로 반복이 없는 문자열을 찾는 부분이라 생각했는데 막상 풀고보니 내 눈엔 리팩토링할 부분이 보이진 않는다..
profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글