이번 문제는 String Array(strarr)와 k(Int, 조합할 갯수)값이 주어집니다.
그리고 strarr의 element들을 k만큼 각각 합쳤을 때 가장 긴 String을 반환하는 문제입니다.
이 문제의 하단에 제약조건이 모두 있는데, n=0, k > n, k <= 0이렇게 세 경우에는 return ""을 한다는 것입니다.
1.Swift
1-1. 본인의 풀이
func longestConsec(_ strarr: [String], _ k: Int) -> String {
guard strarr.count != 0 else { return "" }
guard k != 0 && k <= strarr.count else {
return ""
}
var longStr : String = ""
var newStr : ArraySlice<String>
for index in 0 ..< strarr.count{
if index + k >= strarr.count {
newStr = strarr[index..<strarr.endIndex]
}else{
newStr = strarr[index..<index+k]
}
if newStr.joined().count > longStr.count {
longStr = newStr.joined()
}
}
return longStr
}
먼저 저는 제약조건에 따라서 return ""을 하는 경우를 먼저 선언해줬습니다. strarr.count가 0인 경우, k = 0이거나, strarr.count값이 k보다 작은 경우를 guard를 통해서 먼저 걸렀습니다.
그 후 각각 longStr, newStr이라는 변수를 만들고, strarr.count 만큼 for문을 돌립니다.
for문 안에서는 index + k값이 strarr.count보다 작은지 확인하고, 그것이 true인 경우 newStr에 합칠 수 있도록 구현했습니다.
이 때 strarr.count 값 보다 index + k값이 크거나 같은 경우에는 index부터 strarr.endIndex까지 newStr에 넣어주도록 합니다.
이렇게 구해진 newStr값이 longStr보다 크면 longStr을 교체, 아닌 경우 다음으로 넘어갑니다.
여기서 for문의 조건에 strarr.count - k + 1만큼 해도 무방할 것 같습니다.
1-2. Best Solution
func longestConsec(_ strarr: [String], _ k: Int) -> String {
var longest: String = ""
let n = strarr.count
if n == 0 || k > n || k <= 0 {return longest}
for i in 0..<(n - k + 1) {
let str: String = strarr[i..<i + k].joined(separator: "")
if str.characters.count > longest.characters.count {longest = str}
}
return longest
}
이 풀이도 마찬가지로 처음에 제약조건에 대해서 return을 해주고, 그 외엔 string의 count를 확인해서 가장 긴 String을 return해 주는 것인데, 일단 n - k + 1까지만 돌기 때문에 제 코드보다 for문을 k만큼 덜 돌게 됩니다.
이번 문제는 사실 어려운 것 보다는 String, Character의 이용에 대한 문제였습니다.(6Kyu인 이유는 모르겠어요...)
'Codewars(알고리즘) > 6Kyu' 카테고리의 다른 글
[Codewars] [6Kyu] Give me a Diamond (0) | 2022.01.26 |
---|---|
[Codewars] [6Kyu] Moduli number system (0) | 2022.01.26 |
[Codewars] [6Kyu] How Much? (0) | 2021.03.05 |
[Codewars] [6Kyu] Counting Duplicates (0) | 2021.03.04 |
[Codewars] [6kyu] Braking well (0) | 2021.03.03 |