Bleeding edge

[leetcode] 14. Longest Common Prefix - 자바스크립트 0607 본문

코딩테스트 공부

[leetcode] 14. Longest Common Prefix - 자바스크립트 0607

codevil 2022. 6. 7. 11:32

문제

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 "".

제한사항

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

https://leetcode.com/problems/longest-common-prefix/

 

Longest Common Prefix - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

정렬에 있는 문자를 앞글자부터 비교해서, 가장 긴 공통의 글자가 있는지를 찾는 문제이다.

문제를 해결하기 위해서는 for문을 두번사용해야 한다. 하지만, 일반적으로 문제를 사용하는 방법대로 쓰는 방법의 반대방향인

    for (let i = 0; i < arr[0].length; i++) {
        for (let j = 0; j < arr.length; j++) {
        }
 }

arr[x][y]가 있다고 하면, y위치를 먼저 루프를 시킨뒤 x를 기준으로 루프를 시킨다. 이 순서대로 루프를 시켜야, 각 글자마다 문자가 일치하는지 확인할 수 있다. 테스트 케이스를 ["flower", "flow", "flight"라고 가정을 하면,

"flow"[0] ==="f", "flight"[0]==="f" 둘다 f로 시작하기에, answer = f

"flow"[1] ==="l", "flight"[1]==="l" 둘다 두번째 글자가 l이기에, answer = fl

"flow"[2] !=="f", "flight"[2]!=="f" 세번 째 글자는 다르기에, 여기서 return answer = fl을 하면된다. 

arr.length중 한개라도 성립을 안하면을 찾아야 하기때문에

    for (let i = 0; i < arr[0].length; i++) {
        let isCorrect = true
        for (let j = 0; j < arr.length; j++) {
            if (arr[j][i] !== arr[0][i]) {
                isCorrect = false
            }
        }
        if (!isCorrect) {
            return answer
        } else {
            answer += arr[0][i]
        }
    }

isCorrect를 통하여 체크를 하는 것이 좋다.

다음은 전체 문제풀이이다.

function solution(arr) {
    let answer = ""
    for (let i = 0; i < arr[0].length; i++) {
        let isCorrect = true
        for (let j = 0; j < arr.length; j++) {
            if (arr[j][i] !== arr[0][i]) {
                isCorrect = false
            }
        }
        if (!isCorrect) {
            return answer
        } else {
            answer += arr[0][i]
        }
    }
    return answer
}

만약에 메모리를 조금 더 줄이고 싶다면

function solution(arr) {
    let answer = ""
    if (arr.length === 1) { return arr[0] }
    for (let i = 0; i < arr[0].length; i++) {
        let isCorrect = true
        for (let j = 1; j < arr.length; j++) {
            if (arr[j][i] !== arr[0][i]) {
                isCorrect = false
            }
        }
        if (!isCorrect) {
            return answer
        } else {
            answer += arr[0][i]
        }
    }
    return answer
}

아래와 같은 풀이로 풀이할 수 있다