Algorithm - 문자열 중 중복되지 않는 가장 긴 단어 길이 반환하기

rachel's blog·2021년 10월 21일
0

Algorithm

목록 보기
7/11
post-thumbnail

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

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

🥑 첫번째 접근 방법

/or(let i=0; i<arr.length; i++){
 if(arr[i] === arr[i+1]){
   arr.shift();
  }
  else{
    arr.concat(arr[i], arr[i+1]);
  }
  return arr.toString();
}
  1. 배열의 첫번째부터 비교를 해서 첫번째 인덱스와 두번째 인덱스의 값이 같으면 첫번째 인덱스를 삭제(slice or shift)
  2. 같지 않으면 두 수를 새로운 배열에 담아줘
  3. 그렇게 해서 배열의 순서대로 모든 인덱스를 순회 (for문 사용)
    👉 삭제하면 안된다. 중간에 중복없이 나오고 중복값이 나오다가 또 다시 중복없이 나올 수 있기 때문에
    각각 서로 다른 배열에 담아 두어야 나중에 두 길이 값 비교해서 더 큰 값을 도출할 수 있다.

🥑 두번째 풀이

const newArr = arr.filter((el, idx) => arr.indexOf(el)=== idx)

👉 filter를 써보고 싶었는데, 중복값을 삭제하는 것만 구현가능해서 다른 방법을 모색하기로 하였다.

🥑 세번째 풀이
조금더 논리적으로 접근하고자 로직트리를 작성해보았다.

  1. 배열의 인덱스 순서대로 첫번째 인덱스와 두번째 인덱스를 비교한다.
  2. 두 인덱스를 비교했는데 만약 같은 값(중복)이면 중복된 첫번째 인덱스 까지를 slice한다.
  3. 길이가 줄어든 배열을 다시 첫번째 부터 인덱스 비교를 시작한다.
  4. 다시 배열의 첫번째 인덱스와 두번쨰 인덱스를 비교한다.
  5. 만약 값이 같다면 2번을 다시 시행, 같이 다르면, 새로운 배열에 이 다른 값들을 담는다.
  6. 2~5번을 반복하는데, 이후에 다시 반복된 문자를 만날 경우, 그 때까지의 배열 길이 와 그전에 새로운 배열에 담았던 길이를 비교해서, 작업을 수행한 배열의 길이보다 새롭게 담은 배열의 길이가 더 길 경우, 새로운 배열을 교체한다.
  7. 이렇게 배열을 순회한다음, 기존 배열의 길이와 새로운 배열의 길이 중 더 큰 값을 출력한다.
function getLengthOfStr = str => {
    let arr = [];
    let newArr = [];
    for (let i = 0; i < str.length; i++) {
        let s = str.slice(i, i+1);
        for (let j = 0; j < arr.length; j++) {
            if (s === arr[j]) {
                if (newArr.length < arr.length) {
                    newArr = arr.slice();
                }
                arr = arr.splice(j+1, arr.length);
                break;
            }
        }
        arr.push(ss);
    }
    
    return Math.max(arr.length, newArr.length);
  
  
}

📌 참고사항 : splice()와 slice의 차이점 _ slice는 원본배열을 수정하지 않고, splice는 원본배열을 수정한다.

profile
블로그 이전 : https://rachelslab.tistory.com/

0개의 댓글