[Codekata] 알고리즘 week1-4

HyeLin·2021년 10월 24일
0
post-thumbnail

[문제]

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

[해답]


str = "sttrg";
const 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;
}

[나의 해석]

일단 앞에 빈배열 선언과 새로운 변수를 0 으로 만들어주는 것 들을 생각하기 전에.. 무조건 반복문이 나오겠다! 라는 생각밖엔 못했다 .. 쭈굴 .. 아직 부족한 나 .. 구글링을 통해 가져온 코드를 이해 ^^ 라도 해보자!

 for (let i = 0; i < str.length; i++)
  1. 내가 인자로 넣어줄 배열의 길이만큼 반복문을 실행
let sliceStr = [];
if (sliceStr.indexOf(str[i]) === -1) {
      sliceStr.push(str[i]);}
  1. 중복되기 전까지의 문자들을 하나씩 뽑아서 넣어 줄 빈 배열을 선언!
  2. (str = "sttrg") 만약 sliceStr(지금은 빈 배열)에 s값의 인덱스 값이 없다면(-1) 빈배열에 s라는 값을 넣어라!
if (sliceStr.indexOf(str[i]) === -1) {
      sliceStr.push(str[i]);

      if (lastStr < sliceStr.length) {
        lastStr = sliceStr.length;
      }
    
  1. 중첩 반복문을 사용하여, 빈배열에 s값을 넣은 후 두번째 반복문을 실행한다
  2. 여기서 값의 비교를 위해 let lastStr = 0;를 선언해준다. 중복되지 않은 문자열의 수를 하나씩 추가해가려는 변수! (정확하게 이해했는지 다시 확인 해봐야겠다 . . 머쓱)
  3. 만약 sliceStr의 길이가 0으로 초기화 시켜놓은 lastStr보다 크다면! 그 길이 값을 대입해준다. 현재는 s만 들어와있기 때문에 1.
  4. 이를 계속 반복해봤을때, sttrg의 t도 sliceStr에 없기때문에 담긴다. 하지만 그 다음의 t가 들어갔을 때, 중복이 된다.
if (sliceStr.indexOf(str[i]) === -1)
  1. sliceStr=[s,t]인 상황에 indexOf(str[2])는 1이 되니까 else문으로 빠져나간다.
 else {
      sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1);
      sliceStr.push(str[i]);
    }
  1. sliceStr.slice(sliceStr.indexOf(str[i]) + 1);의 괄호안에 sliceStr.indexOf(str[i]) + 1... str[2]의 값은 1이기 때문에 1을 더하면 sliceStr.slice(2) 가 된다. 그러면 세번째 문자열부터 끝까지 추출이된다. 지금은 stt에서 앞의 st가 버려지고 t한개만 담긴다.
sliceStr.push(str[i]);
  1. 그럼 sliceStr=[t]로 초기화된다. 이때 부터 다시 반복문 실행하여서 결과는 trg이고 3이라는 값이 반환된다.
profile
개발자

0개의 댓글