[알고리즘] 코드카타 1주차 문제-3

croissant·2021년 7월 25일
0

알고리즘

목록 보기
1/2

1주차 3번 문제풀이

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

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

나의 풀이

const getLengthOfStr = str => {

  let strArr = [];
  let startNum;
  
  for(i=0; i<str.length; i++)  { 
    for(j=0; j<str.length; j++)  {
      startNum = str.slice(i,j+1);
      if( startNum !== '')  {
        if( isDuplicate(startNum.split('')) == false ) {
          strArr.push(startNum);
        
        }

      }
    }
  }
  
  let longest = [];
  
  for(i=0;i<strArr.length; i++)  {
    if(strArr[i].length > longest.length)  {
      longest = strArr[i];
    }
  }
  
  function isDuplicate(arr)  {
  const isDup = arr.some(function(x) {
    return arr.indexOf(x) !== arr.lastIndexOf(x);
  });                     
  return isDup;
}

return longest.length;

}

코드의 엄청난 길이가 너무 부끄럽지만 차근차근 해석해보자면,

let strArr = [];
let startNum;
for(i=0; i<str.length; i++)  { 
  for(j=0; j<str.length; j++)  {
    startNum = str.slice(i,j+1);
      if( startNum !== '')  {
        if( isDuplicate(startNum.split('')) == false ) {
          strArr.push(startNum);      
        }
      }
    }
  }

startNum 변수에 인자로 들어온 알파벳으로 구성할 수 있는 모든 단어의 조합을 저장한다.(여기서 단어란 의미없는 알파벳의 나열이 되겠다.)
그때 첫번째 조건문에서 공백만으로 이루어졌을 경우를 제외하며
isDuplicate(startNum.split('')) == false 의 조건인 경우
선언해둔 배열 strArr에 저장한다.


isDuplicate() 함수란

  const isDup = arr.some(function(x) {
    return arr.indexOf(x) !== arr.lastIndexOf(x);
  });                       
  return isDup;
}

arr.some() 함수는 배열 arr 의 요소를 순서대로 callback함수에 전달하고, callback 함수를 실행한다.
callback함수에서는 요소 x의 첫번째 index값과 x의 마지막 index값을 비교해서 같으면(중복x) false를 반환, 다르면(중복o) true를 반환한다. some() 함수는 또한 callback함수가 한번이라도 true를 리턴하면, true를 리턴한다.


이제 중복없는 모든 단어들의 배열이 strArr 저장되었고,

let longest;
  for(i=0;i<strArr.length; i++)  {
    if(strArr[i].length > longest.length)  {
      longest = strArr[i];
    }
  }

위 코드를 통해 배열 strArr의 요소들중 가장 긴 단어를 변수 longest에 저장한다. 그리고 최종적으로 longest.length를 반환함으로써 풀이가 끝이난다.

결론

위 알고리즘 문제를 풀며 느낀점 중 하나는 내가 문제를 풀면서 아무생각 없이? 해답에 다가간다는 느낌이 문득 들었다. 좀 더 간결한 코드를 짤 생각은 없이 for, if 구문을 남발하며 줄일 수 있는 부분도 분명 존재함에도.... 줄이려는 노력조차 하지 않았다. 구글링을 통해서 나는 다른 사람의 문제풀이가 아닌 나만의 풀이를 만들고자 했었지만 나는 아직 배우는 과정이기 때문에 그 틀에서 벗어나 다양한 메서드들의 활용정도는 찾아 적용해가며 문제를 해결했다면 좀 더 좋지 않았을까... 생각해본다.

profile
에러에 진심인 편

0개의 댓글