Swfit/코딩테스트
14. Longest Common Prefix
GGShin
2025. 1. 28. 16:45
- 접근 방법:
1. 주어진 strs array를 string count에 따라 오름차순 정렬.
2. 정렬된 array의 요소들의 firstLetter를 한 번씩 확인. 모든 요소들의 first letter가 동일하면 result에 추가하고, 그렇지 않으면 return.
3. strs array의 첫번째 요소가 가장 count가 작기 때문에, 이 string의 count가 0이 되면 더 이상 확인하지 않음.
class Solution {
func longestCommonPrefix(_ strs: [String]) -> String {
var sortedStrs: [String] = strs.sorted { $0.count < $1.count }
var result: String = ""
var charSet: Set<String> = Set<String>()
while true {
if sortedStrs[0].count == 0 { break }
for i in 0..<sortedStrs.count {
var str: String = sortedStrs[i]
let firstLetter: String = String(str.removeFirst())
charSet.insert(firstLetter)
sortedStrs[i] = str
}
if charSet.count == 1 {
result.append(charSet.first!)
charSet = Set<String>()
} else {
break
}
}
return result
}
}
통과는 했으나 코드를 작성하면서
str array를 여러 번 순회해야 한다는 부분이 효율적이지 못한 것 같았고, 조건 확인문이 조금 복잡(?)해서 실수하기 좋다는 생각이 들었다.
풀이 중에 깔끔한 풀이가 있었는데, strs 중 첫 번째 요소를 prefix라고 가정하고 불필요한 letter를 제거해가는 부분이 새롭게 느껴졌다.
뿐만 아니라, strs를 한 번만 순회하기 때문에 훨씬 효율적일 것이라는 생각이 든다.
class Solution {
func longestCommonPrefix(_ strs: [String]) -> String {
guard strs.count >= 1 && strs.count <= 200 else { return "" }
guard let firstStr = strs.first else { return "" }
var prefix = firstStr
for str in strs {
while !str.hasPrefix(prefix) {
prefix.removeLast()
if prefix.isEmpty { return "" }
}
}
return prefix
}
}반응형