문제풀이 - 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환

양성호·2021년 10월 24일
1

TIL

목록 보기
12/17

문제

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


구현 코드

const getLengthOfStr = (str) => {
  let sliceStr = [];
  let lastStrLength = 0;

  for (let i = 0; i < str.length; i++) {
    if (sliceStr.indexOf(str[i]) === -1) {
      sliceStr.push(str[i]);

      if (lastStrLength < sliceStr.length) {
        lastStrLength = sliceStr.length;
      }
    } else {
      sliceStr = sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1);
      sliceStr.push(str[i]);
    }
  }
  return lastStrLength;
};

초기 계획

  1. indexOf 메소드를 통해서 str의 요소들을 하나씩 검사하면서 중복되지 않는다면 빈 배열에 요소를 담아내도록한다

  2. 배열에 요소를 담아낸 후 담겨진 배열의 길이가 가장길었던 문자열의 길이보다 크다면 가장 긴 배열의 길이를 담는 변수의 값을 갱신한다

  3. 만약 중복된다면 sliceStr에 담겨있던 배열을 초기화 시켜주고 해당 요소를 다시 빈 배열에 넣으면서 다시 시작한다.

  4. lastStrLength 의 값을 리턴하면서 원하는 값을 받는다

오류 ❗

3번 문항의 배열을 초기화 한다는 내용이 문제였다
분명 문제에서 들어준 예시 및 여러 예시들을 인자값으로 줘봤지만 계속 반례가 있는지 test에 통과되지 못했다

오류 발견❗

몇시간 동안이고 고민했던 결과 반례를 찾을 수 있었다
"sttrgstab"이라는 값을 인자로 주었을때 내가 짠 코드대로라면 "trgs"로 4 가 리턴되지만
사실 중복되지 않는 가장 긴 단어는 "rgstab" 였다


해결 방법

중복되는 요소가 발견되면 원래 배열에 있던 중복되는 배열 이후의 값은 보존해야한다
그래서 배열을 초기화 시켰던 부분의 코드를 이렇게 바꿔보았다

sliceStr = []
sliceStr.push(str[i]);

👇👇👇

sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1);
sliceStr.push(str[i]);

slice() 메소드와 indexOf()를 활용하여 indexOf를 통해 중복되는 요소의 위치를 알아내고 +1 을 추가하여 slice()메소드가 중복되는 요소를 포함한 그 전의 요소들만 삭제 할 수 있도록 구현했다

반례를 찾는것이 생각보다 힘들었다 하지만 이렇게 반례를 계속 생각해서 찾아냈고 그 문제를 해결까지 하니 더욱 더 깊게 이해할 수 있었다

0개의 댓글

관련 채용 정보