<코드타카 1주차 03.>

강민수·2021년 12월 19일
0

Day 3

입력과 예상 출력 데이터 타입

  • Input 입력 데이터 타입: String
  • Output 출력 데이터 타입: Number

문제 접근 / 정리 / 아이디어들

  1. 입력 받은 String 타입 데이터는 순회가 가능한 값이다.

    1. String을 Array(배열) 데이터 타입으로 바꿔야하나 생각해 보았지만, String도 순회가 가능한 데이터 타입 이므로 입력 받은 값 그대로의 데이터 타입을 사용하여 순회 하기로 했다.
  2. str 으로 중복 되는 값이 없이 만들 수 있는 모든 조합을 만들어서 최대 길이를 찾아보기로 했다.

    1. 첫요소 인덱스 0부터 시작하여 길이 만큼 순회하여 만들수 있는 조합을 새로운 변수에 더해서 담았다가 이미 포함 된 알파벳을 만나면 순회를 중단하고 만들어진 조합을 배열에 추가해주자.
    2. 배열에 추가하는 글자의 조합은 만들어진 글자의 길이를 숫자 타입으로 저장.
    3. 배열에 담겨진 글자의 길이들 중 최대값을 반환.

    테스트 성공한 풀이들

첫번째 풀이

우선 생각한 로직이 맞는 건지 확인하기 위해 많은 메소드나 가독성을 녹여내지 못하고 예상 출력에 성공했다.

입력 받은 str을 for문으로 두번 순회하여 중복되지 않는 가능한 글자들의 조합을 만들고 배열에 담고,

배열에 담긴 요소들을 또 다시 for문으로 순회하여 0으로 초기화 해둔 text 변수에 순회 할때 마다 더 큰 값을 저장하여 순회가 끝난 후 그 값을 반환한다.

const getLengthOfStr = (str) => {
  const arr = [];
  let strCombination = "";

  for (let i = 0; i < str.length; i++) {
    strCombination = str[i];
    for (let j = i + 1; j < str.length; j++) {
      if (strCombination.includes(str[j])) {
        break;
      } else {
        strCombination += str[j];
      }
    }
    arr.push(strCombination);
  }

  let text = 0;

  for(i = 0; i < arr.length; i++){
      if( text < arr[i].length){
        text = arr[i].length;
     }
  }
  return text;
}

두번째 풀이 (배열 순회부분 리팩토링)

for문을 3번 순회한 첫번째 풀이중 마지막 for문을 배열 메소드로 대체해 리팩토링 해보았다.

배열 메소드 sort 를 사용하니 text라는 변수로 배열에 담긴 요소들의 길이를 따로 기록 하면서 확인하지 않아도 최대 길이를 찾을 수 있었다.

배열의 sort 메소드는 원본배열의 정렬을 수정하고 기본적으로는 오름차순으로 정렬한다고 하지만 아래와 같이 정렬 순서를 정의하는 함수를 인수로 전달하여 최대 값을 반환 할 수 있었다.

const getLengthOfStr = (str) => {
  const arr = [];
  let strCombination = "";

  for (let i = 0; i < str.length; i++) {
    strCombination = str[i];
    for (let j = i + 1; j < str.length; j++) {
      if (strCombination.includes(str[j])) {
        break;
      } else {
        strCombination += str[j];
      }
    }
    arr.push(strCombination);
  }

	if(str.length>0){
	  return arr.sort((a, b) => b.length - a.length)[0].length;
	} else return 0
}

세번째 풀이 (배열 메소드의 또 다른 방법)

자바스크립트의 Standard-Built-In 객체인 Math 는 Number 데이터 타입에 사용 할수 있는 많은 속성과 메소드를 제공한다.

첫번째 풀이와 두번째 풀이 보다 조금 더 직관적인 메소드 같아서 Math에서 제공하는 Math.max() 를 사용하여 리팩토링 해보았다.

코드가 한결 짧아지고 max라는 단어로 최대 값을 구한 다는 것을 알수 있어서 가독성도 좋아진거 같다.

const getLengthOfStr = (str) => {
  const arr = [];
  let strCombination = "";

  for (let i = 0; i < str.length; i++) {
    strCombination = str[i];
    for (let j = i + 1; j < str.length; j++) {
      if (strCombination.includes(str[j])) {
        break;
      } else {
        strCombination += str[j];
      }
    }
    arr.push(strCombination.length);
  }

  return Math.max(...arr, 0)
}

느낀점

수요일 마다 문제가 어렵다고 들었는데, 진짜 어려웠다! 그치만 팀이 함께 문제를 분해하고 파헤쳐보니 다양한 아이디어가 나왔고 서로 설명하는 시간이 흥미진진했다. 의사코드를 작성하면서 어떤 방법으로 하면 왜 될거 같은지 그리고 또 왜 안 될거 같은지 각자 코드의 흐름을 예상해 볼수 있는 능력자 팀 멤버들 이였다. 현재 풀이는 위와 같이 마무리 되었지만, 짧고 가독성 좋은 풀이 방법을 위해 불 태우신 반응하는딸기팀🍓 고생하셨습니다!

오늘은 위워크에서 오프라인 세션을 하는 날이여서 5명 모두가 한팀으로 코드카타를 진행헀다.

✌️ All tests have passed 9/9

profile
개발도 예능처럼 재미지게~

0개의 댓글