FrontEnd :-)

[LeetCode-JS] Longest Common Prefix 본문

JavaScript/Algorithm

[LeetCode-JS] Longest Common Prefix

code10 2022. 12. 9. 00:56

🙋 문제: Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

 

Example 1:

Input: strs = ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: strs = ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

 

Constraints:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] consists of only lowercase English letters.

🅰️ 풀이:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    let prefix = "";
    prefix = strs[0]
    for(let i = 0; i < strs.length; i++){
      while (strs[i].indexOf(prefix) !== 0){
          prefix = prefix.substring(0, prefix.length -1);
      }
    }
    return prefix
};

>> for문에 while 적용하면 될 것 같다는 생각까지는 했는데, indexOf 활용과 문자를 뒤에서부터 자르는 건 생각하지 못했다.. 내가 생각한 게 거의 없는 거지.. 풀이 검색했다 😢

>> strs 배열의 첫 번째 문자를 기준으로, 나머지 문자들에 같은 문자가 있는지 indexOf로 판단(있으면 겹치는 문자의 첫 번째 index 값, 없으면 -1 반환)하고, while 반복문을 돌려서, strs[0] 의 문자를 뒤에서부터 줄여가며 비교. 

>> 배열에 문자가 하나만 있으면 for문까지 갈 필요가 없으므로, 맨 위에 아래 코드를 추가했다.

if(strs.length === 1) return strs[0];

 

다른 사람 풀이:

var longestCommonPrefix = function(strs) {
    if(strs.length == 0) return '';
    var result = '';
    for(var i = 0; i < strs[0].length; i++) {
        if (strs.every(function (item) {
                return strs[0][i] === item[i];
            })) {
            result += strs[0][i];
        } else {
            break;
        }
    }
    return result;
};

>> 조건에서 strs.length 가 1보다 크다고 했는데, 여러 풀이에서 if(strs.length == 0) return ''; 이 부분이 포함되어 있어서 의문. 문제 조건이 나중에 보완된건가??

>> every 메서드 공부해보자 : 

every() 메서드는 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트합니다. Boolean 값을 반환합니다.

var longestCommonPrefix = function(strs) {
    var result='';
    for(var i=0; i<strs[0].length; i++) {
        for(var j=0; j<strs.length; j++){
            if(i === strs[j].length || strs[0][i] !== strs[j][i]) 
                return result;
        }
        result = result+strs[0][i];
    }
    return result;
};

>> 맨 처음 문제 보자 마자는 이중 for문을 생각했었지만 완성하지 못했는데... 참고.

>> i === strs[j].length 이 조건이 왜 들어가는지 이해가 안 된다... >= 도 아니고... 없애고 if(strs[0][i] !== strs[j][i]) 조건만 적용해도 Accepted, 통과함.

>> var는 지양하므로, let으로 대체할 수 있겠다.

'JavaScript > Algorithm' 카테고리의 다른 글

[LeetCode-JS] Merge Two Sorted Lists  (0) 2022.12.15
[LeetCode-JS] Valid Parentheses  (0) 2022.12.10
[LeetCode-JS] Roman to Integer  (0) 2022.12.08
[LeetCode-JS] Palindrome Number  (0) 2022.12.07
[LeetCode-JS] Two Sum  (0) 2022.12.05
Comments