[문제풀이] 중복되지 않은 단어의 길이 / TIL # 44

velg·2021년 9월 19일
0

문제풀이

목록 보기
6/12

Code Kata

문제

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

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

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

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

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

내 풀이

const getLengthOfStr = str => {
  subStr = '';
  max = 0;

  for(let i = 0; i < str.length; i++) {
    for(let j = i; j < str.length; j++) {
      if(subStr.includes(str[j])) {
        if(max < subStr.length) max = subStr.length;
        subStr = '';
        break;
      }
      else {
        subStr += str[j];
        if(j === str.length - 1){
          if(max < subStr.length) max = subStr.length;
          return max;
        }
      }     
    }
  }
  return max;
}
  • 상위 for문은 문자열을 한 번 순회하기 위해서, 하위 for문은 접근한 문자의 중복 여부를 체크하기 위해서 중첩 for문으로 작성함

  • if 구문
    현재까지 자른(중첩되지 않은) 문자열안에 현재 접근한 문자가 있다면,
    현재까지 가장 긴 문자열의 길이를 저장해놓은 max와 비교를 진행하고 값을 대입 또는 유지한다
    그 후에 subStr은 초기화하고 break로 하위 for문을 탈출시킨다

  • else 구문
    현재 접근한 문자가 subStr(현재까지 자른 문자열)에 없다면 subStr에 추가한다

  • if(j === str.length - 1) ?
    위의 로직으론 중첩된 문자 없이 끝까지 도달할 경우 값을 저장할 수 없음으로 해당 조건문을 통해 중첩된 문자 없이 원본 문자열 끝에 도달 했을 경우를 캐치한다
    그리고 끝까지 중첩 문자가 없는 것을 확인했음으로 상위 for문으로 돌아가 순회를 할 필요가 없다
    따라서 바로 max값을 return 해준다

마치며..

처음엔 순회를 하며 현재 문자와 중첩된 문자를 찾고, 중복된 문자의 인덱스를 통해 앞 뒤를 잘라 값을 구하는 로직을 구성했는데, 다음 같은 경우가 실패하였다

  • "abcdefghcpisln"

이 경우는 문자 'c'가 중복된 위치에서 앞, 뒤로 자른 "abcdefgh", "cpisln" 보다 "defghcpisln" 같이 자르는게 중복 없는 가장 긴 문자열을 얻을 수 있었기에 계속 실패하였고 푸는데 오래 걸렸다 ㅠ 🥲

앞으론 너무 많은 작업을 한꺼번에 하려는 습관, 문제를 너무 대강 읽는 습관을 고쳐서 문제풀이를 잘 할 수 있도록 노력해야겠다

profile
초보 개발자

0개의 댓글

관련 채용 정보