코딩테스트 & 자료구조
[LeetCode, Kotlin] 14. Longest Common Prefix 풀어보기
Aosta
2022. 12. 6. 18:07
문제
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 "".
Input: strs = ["flower","flow","flight"]
Output: "fl"
class Solution {
fun longestCommonPrefix(strs: Array<String>): String {
}
}
처음에 prefix 라는 단어를 놓쳐서 문제를 보자마자 기겁했었습니다.
전 배열에 공통적으로 포함되어 있는 (자리가 상관없는) String 중 가장 긴 거 찾기 인 줄 알았습니다..
다행히 시작 위치는 앞에서부터 고정입니다.
나의 풀이
문제를 보고 필요한 기능들을 정리해봤을 때,
- 빈 값과 null 예외처리
Parameter 로 들어온 배열 중에서 가장 length 가 짧은 String 찾기- 반복문으로 prefix 찾기
- 조건에 부합하는 값 리턴
이렇게 구성할 수 있었습니다.
class Solution14 {
fun longestCommonPrefix(strs: Array<String>): String {
var result = ""
// 배열이 비어있으면 "" return
if (strs.isNotEmpty()) {
/*
배열 중에서 가장 길이가 적은 것을 쓰고 싶었지만
또 for 문 써야하기 때문에 strs[0] 으로 대체
*/
val strSample: String = strs[0]
for (i in 0..strSample.length) {
// t , te, tes, test 순으로 올라감
val test = strSample.substring(0, i)
/*
이 for 문을 통과하면 모든 str에 동일한 prefix
*/
for (str in strs)
if (!str.startsWith(test))
return result
result = test
}
}
return result
}
}
풀이 시작 전 구성한 내용대로 하다가
2번 삭선 된 내용은 사실 가장 길이가 짧은 String이 아니어도 크게 상관이 없었습니다.
그래도 다른 문제에서 '배열 중 가장 길이가 짧은 순으로 정렬' 이 필요할 수도 있겠다 싶어서 정리해보았습니다.
/* [## 임의로 맨 앞에 말고 확실하게 가장 작은 str 값을 쓰려면? ##] */
val comparator : Comparator<String> = compareBy { it.length }
val strOrdered = strs.sortedWith(comparator) // sort의 시작복잡도 : O(nlogn)
val shortestStr = strOrdered[0]
또다른 풀이방법
사이트에서 분할정복(Divide and Conquer) 방식으로 풀이한 내용도 있어서 추가하고자 합니다.