Code Kata Day 3

SYhwang·2023년 1월 18일
0

코드카타

목록 보기
3/10

문제

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

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

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

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

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

풀이

const getLengthOfStr = str => {
  let newStr = "";
  let maxArr = [0];

  for (i = 0; i < str.length; i++) {
    if (newStr.indexOf(str[i]) === -1) {
      newStr = newStr + str[i];
        if (i === str.length - 1) {
         maxArr.push(newStr.length); 
        }
    } else {
      maxArr.push(newStr.length);
      newStr = newStr.slice(newStr.indexOf(str[i])+1) + str[i]
    }
  }
  
  return Math.max(...maxArr)
}
  1. let으로 빈 스트링 newStr 과 배열 newArr 를 선언한다.
  2. for 안에서 str의 글자 하나하나를 index 로 접근해서
  3. newStr 안에 str[i]가 없다면 (newStr.indexOf(str[i]) === -1 이면) newStr과 str[i]를 결합한다.
  4. newStr 안에 str[i]가 있다면 지금까지 결합한 newStr의 길이를 maxArr에 요소로 push 한다.
  5. 그리고 나서 newStr.indexOf로 newStr 안 중복되는 str[i]의 위치를 찾아 처음부터 중복알파벳 까지는 삭제하고 중복알파벳 뒤쪽만 남기도록 한다.
  6. str의 마지막 글자(i === str.length - 1 ) 는 newStr 안에 없더라도 지금까지 결합한 newStr의 길이를 maxArr에 push 한다.
  7. maxArr의 요소 중 가장 큰 값을 Math.max펼침 연산자를 사용해 return 한다.
  8. 빈 스트링이 인자로 들어왔을 경우는 에러가 발생하기에 maxArr의 초기값으로 [] 대신 [0]을 넣어 주었다.

- 로직대로 알단 코드를 작성해보고 테스트 모듈을 run 했을 때 통과하지 못하는 경우를 하나씩 제거해가면서 코드를 수정했는데 마지막까지 case 하나를 통과하지 못했다. 시간이 나면 다시 고민해봐야겠다.

  • !! 로직상 빼먹은 부분을 발견해 수정했다. 나는 for문에서 중복알파벳이 걸렸을 때(5번 부분) maxArr에 push한 뒤 newStr을 단순히 newStr = str[i] 로 초기화 하고 다음 반복으로 넘어가면 된다고 생각했는데, 그러면 abcdecfop 같은 문자열에서는 abcde / cfop 로 나누어 세게 되어서 오류가 발생하고 있었다!
  • 실제로는 abcde / decfop 로 나누어야 하는 셈이므로 중복알파벳 발견시 newStr를 전부 삭제하는 것이 아니라 맨 앞부터 중복알파벳까지만 삭제하고 그 뒤부터는 남기는 식으로 newStr = newStr.slice(newStr.indexOf(str[i])+1) + str[i] 으로 변경했더니 모든 테스트 케이스를 통과하였다.
  • maxArr에 newStr.length 대신 newStr 자체를 push 해서 콘솔로 찍어보니 바로 어디가 잘못되었는지 보인다. 문제가 생겼을 때는 코드만 훑으며 고민하지 말고 꼭 실제 값으로 확인 가능하게 콘솔을 찍어보는 습관을 들여야겠다.

0개의 댓글