[TIL] CodeKata(Javascript) 1-3rd

이나현·2021년 7월 21일
0

JavaScript

목록 보기
9/13
post-thumbnail

문제

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

나의 코드

const getLengthOfStr = str => {
  // 아래 코드를 작성해주세요.
  //string을 한글자씩 쪼갠다 & 새로운 배열을 만든다. 
  let splitStr = str.split(''); //['a','b','c','a','b','c']
  let newArray = []
  
//반복문을 돌려서 str에서 같은값이 아니라면, 새로운 배열에 넣는다. 
  for(let i=0; i <splitStr.length; i++) { 
      if(splitStr[i] !== splitStr[i+1]){
        newArray.push(splitStr[i])
//새로운 배열을 반복문을 돌려서, 새로운 배열내 값과 string의 다음 값이 같다면, 
새로운 배열의 길이를 반환한다. 
        for(let j=0; j <newArray.length; j++) {
          if(newArray[j] === splitStr[i+1]){
          return newArray.length;
          }
        }
      } 
// 만약 str[i]와 str[i+1]의 값이 같다면, i+1까지에 있는 값까지의 string을 잘라 반환한다.
      else {
            return splitStr.slice(0, i+1).length
          }
  }

여기서는 값이 같다면 그 앞까지의 값만 반환한다는 문제가 생겨버린다.
혹은 배열에 들어간 값만 반환된다는 한계가 생긴다.

이를 해결하려면, 문자열 자체를 배열에 넣는 것이 아닌 문자열의 길이를 반환하는 것에 포커스를 둬야한다.

모범답안

const getLengthOfStr = str => {
 //빈 배열과 빈 문자열을 선언한다. 
  	let arr = [];
    let newStr = '';
  //반복문을 선언하여 str에 있는 값 하나하나를 새로운 스트링에 담는다. 
  //새로운 스트링에 str[i]의 값이 있다면
  //새로운 스트링은 그 값을 가진 index+1로 쪼개 선언한다.   
    for (let i in str) {
    	if (newStr.includes(str[i])) {
        	newStr = newStr.slice(newStr.indexOf(str[i]) + 1);	
        } else if(str.length === 0) {
          return 0
        }
    	newStr += str[i];
      //배열에 newStr의 모든 길이를 넣는다. 
        arr.push(newStr.length);
    } 
    //배열에 있는 값 중에 가장 큰 값을 빼온다.     
    return Math.max(...arr);

}
console.log(getLengthOfStr('asdfgaedfadsf'))

해당 답안도 현재 str이 빈문자열일 때, 0의 값을 반환하지 않아 문제가 생긴다..ㅎㅎ
이건 주말에 해결해보기!

profile
technology blog

0개의 댓글