[Leetcode] Longest Common Prefix

Hyodduru ·2022년 3월 19일
0

Algorithm

목록 보기
17/25
post-thumbnail

내가 생각한 로직

  1. 빈 문자열을 담은 변수 answer을 만든다.

  2. strs라는 배열의 첫번째 단어를 for문을 돌린다.

  3. for문을 돌며 answer 안에 한 단어씩 넣어준다.

  4. 한 단어 씩 넣어줄 때 for문안에서 배열의 두번째 단어부터 끝까지 도는 for문을 돌리고, 단어들의 i번째 문자가 answer의 i번째 문자와 동일한지 확인한다.

  5. 맞다면 계속해서 answer에 첫번째 단어의 문자들을 넣어주고 다르다면 answer에서 마지막으로 추가한 문자를 제외한 값을 return한다.

  6. strs에 단어가 하나만 존재한다면 이중포문을 돌지 않고 그냥 answer을 return한다.

풀이는 아래와 같다.

const getPrefix = (strs) => {
  let answer = "";
  // 혹시나 strs의 첫번째 단어가 undefined일 경우 빈 문자열을 return한다.
  if (strs[0] === undefined) return answer;
  
  for (let i = 0; i < strs[0].length; i++) {
    answer += strs[0][i]; //첫번째 문자열에서 앞에서부터 차례로 한 단어씩 넣어준다.

  for (let j = 1; j < strs.length; j++) {
  	// 두번째 단어의 문자열 앞에서부터 answer와 동일한지 확인한다.
    if (strs[j][i] !== answer[i]) {
    answer = answer.split("").slice(0, answer.length - 1).join("");    
     return answer      
    }
   }
  }
return answer;
};

내가 풀이한 방식이 이중포문이라 혹시 다른 더 좋은 방법이 있을까 찾아봤는데 for문과 while, 그리고 substring을 이용한 방식이 있었다.

풀이는 아래와 같다.

const strs = ['start', 'stair', 'step']  

const getPrefix = (strs) => {
    let answer = strs[0];  // 첫번째 단어
    
    if (strs[0] === undefined) return "";
    
    for(let i=1; i<strs.length; i++){            
        while(strs[i].indexOf(answer) !== 0){               
            answer = answer.substring(0, answer.length-1)
        }
    }
    return answer;
}

첫번째 단어를 answer에 넣어준 후,
예를 들어 start를 넣어준 후,

배열의 두번째 단어인 stair 부터 for문을 돌린다.

그리고 stair.indexOf(answer)이 0이 될 때까지 answer의 값을 끝에서부터 잘라준다.
start => star => sta => st
answer이 st가 되었을 때 stair는 st를 포함하고 있기 때문에 indexOf값이 0되고 while문은 끝이 난다.
그리고 그 다음 단어인 step도 같은 로직으로 while이 실행된다.
반복문이 다 끝난 후 answer의 최종값이 return 된다.

마무리 🍯

내가 한 풀이보다 훨씬 간편한 방식인 것 같다.
그리고 문자열을 자를 때 substring이라는 문자열 내장함수를 꼭! 이용해야겠다.
괜히 배열로 바꾼다음에 잘라줬네,, ㅎ

알고리즘 풀 때마다 최대한 이중포문 대신에 다른 효율적인 방식이 있는지 더 고민해봐야겠다. ❗️

profile
꾸준히 성장하기🦋 https://hyodduru.tistory.com/ 로 블로그 옮겼습니다

0개의 댓글