[wecode] 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이 구하기

·2022년 10월 7일
0

2022년 10월 6일 목요일... 코드카타 3일차였다.

문제 : 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이 구하기

예) aaaa => 1, abcdedfs => 5, sttrg => 3

처음 문제를 본 나는
딱 이상태였다.



그래도 30분정도 더 고민했더니
이상태가 되었다.

팀원들이랑 머리를 맞대고 아무리 고민을 해봐도 로직을 어떻게 짜야할지 감이 안잡혔다.
그렇게 코드카타 정규 시간이 끝나버렸다.
내 코딩인생(얼마안됨)에서 이렇게 어려운 문제는 처음이였다(애초에 아직 어려운 문제를 안풀어봄). 아무리 어려워도 머리속으로 로직은 그려졌었는데 이번 문제는 로직조차 떠올리기가 힘들었다. 솔직히 자존심이 상했다. 니가 뭔데 안풀려!!

그 상태에서 계속 머리를 싸매고 고민하며 차근차근 과정을 정리해봤다.

  1. 문자열 내에서 중복되는 문자를 찾아야 한다.
  2. 중복되는 문자가 감지되면 기존의 문자열을 삭제하고 새로 시작한다.
  3. 삭제될 문자열의 길이를 저장한다.
  4. 반복
  5. 저장된 길이보다 더 긴 문자열이 생기면 저장된 길이를 그 문자열의 길이로 바꾼다.
  6. 반복 과정이 완료되면 저장된 길이를 반환한다.

위의 로직대로 코드를 작성해봤다.

const getLengthOfStr = str => {
  let arr = []; //가장 긴 문자열의 길이를 저장할 배열
  let result = ""; // 연속되지 않은 문자로 이루어진 문자열
  if(str==="") return 0; //빈 문자열일 경우에는 0 반환
  for(let i in str){
  	if(result.indexOf(str[i])===-1){ // result에 str의 i 번째 문자가 존재하지 않을 경우
      result = result + str[i];// result에 str의 i번째 문자를 추가
      if (arr.length === 0){// 배열이 비어있을 경우
        arr.push(result.length) // 무조건 값을 저장
      } else { //배열이 비어있지 않을 경우
        if(arr[0] < result.length){ //배열에 저장된 숫자보다 result의 길이가 클 경우에
          arr=[]; // 배열을 비우고
          arr.push(result.length) //result의 길이를 저장
        }
      }
    } else { //result에 str의 i번째 문자가 존재할 경우
      result = str[i]; // 기존의 result를 지우고 str의 i번째 문자로 다시 시작
    }
  }
  return arr[0];//저장된 숫자를 반환
}

로직을 보면 전혀 문제가 없어보이고 테스트를 해봐도 의도한대로 잘 작동하는것 같았다.
하지만 replit에서 테스트를 돌려보면 9개의 테스트코드중에 하나가 오답이 나오는 것이었다.
아... 진짜.... 이번엔 성공일줄 알았는데...

다음날 위코드에 가서 동기들에게 내가 작성한 코드를 보여주며 의견을 물었지만, 무엇이 문제인지 알아내기는 어려웠다. 일과를 끝내고 저녁시간에 멘토님께도 여쭤봤지만 답이 나오지는 않았다.  그러다 한 동기가 나에게 물었다.

저 문제에 "abcdeafhlqpzw" 라는 문자열을 넣으면 정답은 몇일까요?

"a"bcde"a"가 겹치니 가장 긴 문자열은 "afhlqpzw"가 되니 8이라고 생각했지만 정답은 겹치는 첫 a를 제외하면 겹치는 문자가 없는 "bcdeafhlqpzw"가 가장 긴 문자열인것이였다.

드디어 내가 짠 로직의 문제점을 발견했다. 내 코드는 중복된 문자를 만나면 그 문자 전에있던 문자열들을 삭제시켰었는데, 겹치는 문자들 사이에 있는 문자열은 살려놔야한다는것을 깨달았고 다음과 같이 수정했다.

const getLengthOfStr = str => {
  // 아래 코드를 작성해주세요.
  let arr = [];
  let result = "";
  if (str === "") return 0;
  for (let i in str) {
    if (result.indexOf(str[i]) === -1) {
      result = result + str[i];
      if (arr.length === 0) {
        arr.push(result.length)
      } else {
        if (arr[0] < result.length) {
          arr = [];
          arr.push(result.length)
        }
      }
    } else {
      result = result.slice(result.indexOf(str[i]) + 1) + str[i]; // 수정된 코드
    } // result에 str의 i번째 문자가 존재할 경우 중복된 문자까지 잘라내고 그 문자를 맨 뒤에 붙인다.
  }
  return arr[0];
}

모든 테스트를 통과했다.

다른사람의 풀이를 베끼지 않고 문제를 풀고싶어서 꽤 많은 시간을 들였는데 결국 풀어내서 굉장히 뿌듯했다.
아직 문제를 볼때 넓은 시야와 정확한 문제 파악이 부족하다는것을 느꼈고 이 부분을 열심히 키워나가야겠다.

0개의 댓글