[Code Kata] Day 3.중복이 없고, 연속적으로 가장 긴 단어의 길이 반환하기

Pulan·2022년 8월 6일
0

알고리즘

목록 보기
2/3
post-thumbnail

String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문
str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문
str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문

문제 정리

하나의 문자열을 입력 받아서 그 문자열 중에 중복이 없고, 연속적으로 가장 긴 단어의 길이를 반환하해라

접근 방법

  1. 중복되지 않은 문자를 넣을 변수를 넣는다. -> notOverlap = []
  2. 그 전까지의 문자열(notOverlap)의 최대 길이를 넣을 변수를 만든다. -> maxLengthArr;
  3. (2)의 변수를 만든 이유는 내가 사용할 방법이 배열 메서드의 reduce()를 사용할거기 때문이다.
  4. reduce 메서드를 사용하기 위해서는 배열이 필요하여 str(= 받아오는 인자 값)을 배열로 만들어준다. -> split()
  5. 만들어진 배열을 reduce 메서드를 이용하여 각 값마다 notOverlap 변수에 포함되어 있는지 확인한다. -> 이때 reduce 메서드의 누적값(acc)의 초기값은 빈 배열이다.
str.split('').reduce((acc, currentValue) => {}, []);
  1. 포함되어 있으면 누적값에 notOverlap의 길이를 넣어주고 notOverlap을 초기화 시켜준다. -> 여기서 왜 초기화 시켜주지?라는 의문이 들수있다. 그러면 문제를 한 번더 보고오면 이해할 수 있다.
if (notOverlap.includes(currentValue)) {
      acc.push(notOverlap.join('').length);
      notOverlap = [];
    }
  1. 포함 되있지 않으면 notOverlap에 값을 넣어준다.
  2. reduce 메서드가 끝나면 maxLengthArr에 저장된 길이들을 풀어주고, notOverlap의 길이를 불러와서 최대값을 구하면 된다.
Math.max(...maxLengthArr, notOverlap.length);

전체 코드

const getLengthOfStr = str => {
  let notOverlap = [];
  const maxLengthArr = str.split('').reduce((acc, currentValue) => {
    if (notOverlap.includes(currentValue)) {
      acc.push(notOverlap.join('').length);
      notOverlap = [];
    }
    notOverlap.push(currentValue);

    return acc;
  }, []);
  return Math.max(...maxLengthArr, notOverlap.length);
};

console.log(getLengthOfStr('abcabcabc'));
console.log(getLengthOfStr('aaaaa'));
console.log(getLengthOfStr('sttrg'));

후기

그동안 잘 사용해보지 못했던 reduce에 대해서 조금 더 이해하게된 계기를 얻은거 같다.

profile
현재 개발 중인 블로그로 내용들을 개선하면서 업데이트하고 있습니다. https://www.plu457.life/

0개의 댓글