Algorithm) Codekata_Day 3

2042 단어 algorithmalgorithm

❓ Question

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

📝 My Solution

반복문을 통해서 해당 문자열을 새로운 배열에 넣어준다.
그러다 중복이 발생하면 splice 함수를 통해 지금까지 들어간 배열을 잘라준다.
그 배열의 길이를 {현재 길이} 라는 변수에 넣어주고,
{최고 길이} 변수와 비교해 가장 숫자가 높은 변수의 값을 출력한다.

const getLengthOfStr = str => {				
  const arr = [];
  let mostLength = 0;
  let presentLength = 0;

  for (let i = 0; i<str.length; i++) {
    if (arr.indexOf(str[i]) === -1) {
        arr.push(str[i])
    } else if (arr.indexOf(str[i]) !== -1) {
        presentLength = arr.splice(0,arr.indexOf(str[i])).length
        if (mostLength >= presentLength) {
          presentLength = 0
        } else {
          mostLength = presentLength
        }
        arr.push(str[i])
      }
  }
  if (mostLength >= arr.length) {
    return mostLength
  } else {
    return arr.length
  }
}

▪️ Solution review

배열을 출력하라는 것이 아닌 가장 긴 단어의 길이를 반환하라 해서
숫자를 비교하는 방식으로 길이를 재 봤다.

하지만 (abcdefghijcklmnop) 와 같은 문자열이 들어왔을 때
c를 중복값으로 잡고 넘겨버리는 탓에 이런 문자열이 들어왔을 때는 오류를 보여줬다.


📝 Another Solution

const getLengthOfStr = str => {
  let arr = [];
  let newTxt = "";
  if(str.length === 0) {
    return 0;
  }
  for (let i in str) {
    if(newTxt.includes(str[i])){
      newTxt = newTxt.slice(newTxt.indexOf(str[i]) + 1);
    }
    newTxt = newTxt + str[i];
    arry.push(newTxt.length);
  }
  return Math.max(...arr);
}

▪️ Solution review

이 방법은 각 배열의 길이를 저장해서 가장 큰 수의 값을 리턴하는 방식이다.

arrnewTxt 라는 변수를 각각 설정해주고,
includes 함수를 이용해 텍스트에 중복 되는 값이 있다면
해당 값의 앞을 날리고 그 뒤로 계속해서 진행한다.
그 때마다 배열의 길이를 arry로 저장시켜 준다.

모든 실행이 종료되면 Math.max()를 통해서 가장 긴 값을 찾아준다.

중복값을 찾아서 해당 값까지의 배열 길이를 이용하려 했던 것은 비슷하나,
그 뒤의 과정들을 제대로 처리하지 못했던 차이가 있었던 것 같다

좋은 웹페이지 즐겨찾기