알고리즘/코드카타

Week1 - Day3 (Javascript)

시럽이 2022. 7. 6. 15:08

문제

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

str: 텍스트 return: 중복되지 않은 알파벳 길이 (숫자 반환)

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

str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문

str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문

 

 

내 Flow

  1. String형을 배열로 만들어 쪼갠다.
  2. for문으로 같은 문자가 나오면 그 앞까지의 배열을 저장한다.
  3. 그 뒤부터 또 for문을 돌리고 또 같은 문자가 나오면 배열을 2에서 나온 배열의 length와 비교해서 더 큰 것을 반환한다.
  4. indexOf가 찾는 문자열이 없으면 -1을 리턴하므로 값이 -1이면 for문이 멈춰야 한다.

 

💬 문제를 봤을 때 문장으로 풀어쓸 수는 있겠는데 어떤 메소드를 사용해야 하는지는 어렵다...

결국 구글링해서 다른 분의 풀이를 보고 이해하는 걸로 족했다. 코드카타 둘째날부터 이런 난이도는 너무한 거 아니냐고요😥

 

풀이

const getLengthOfStr = str => {
  let sliceStr = [];
  let result = 0;
  
  for (let i = 0 ; i < str.length ; i++) {
    if (sliceStr.indexOf(str[i]) === -1) {
      sliceStr.push(str[i]);
      if (result < sliceStr.length) {
        result = sliceStr.length
      }
    }
    else {
      sliceStr = sliceStr.slice(sliceStr.indexOf(str[i]) + 1)
      sliceStr.push(str[i])
    }
  }  
  return result;
}
  1. 빈 배열을 만든다.
  2. 배열의 개수를 비교할 값을 우선 0으로 값을 준다.
  3. 빈 배열에서 인자로 받은 문자를 indexOf를 사용하여 찾고, 없을 경우 빈 배열에 넣는다.
  4. 0으로 준 result 값과 배열의 개수를 비교하여 배열의 개수가 더 클 경우 result 값에 그 개수를 값으로 넣는다.
  5. 문자열에서 중복된 문자가 나오면 3번의 조건이 성립하지 않아 else문이 작동한다.
  6. 중복되는 요소가 발견되면 원래 배열에 있던 중복되는 배열 이후의 값은 보존해야한다.
  7. indexOf를 통해 중복되는 요소의 위치를 알아내고 +1 을 추가하여 slice()메소드가 중복되는 요소를 포함한 그 전의 요소들만 삭제 할 수 있도록 구현한다.

 

 

 

참고

https://bit.ly/3NQdTfW

 

'알고리즘 > 코드카타' 카테고리의 다른 글

Week2 - Day3 (Javascript)  (0) 2022.07.14
Week2 - Day2 (Javascript)  (0) 2022.07.14
Week2 - Day1 (Javascript)  (0) 2022.07.11
Week1 - Day5 (Javascript)  (0) 2022.07.07
Week1 - Day2 (Javascript)  (0) 2022.07.05