3456. Find Special Substring of Length K
콘테스트 437의 1번문제다
문제 설명
substring
을 잘 발굴해내는 문제인데, 같은 문자열이 정확히k
번 반복되었을 때를 찾아내는 것이다.- 정답은
Bool
타입이라 그냥 판단만 잘 되면 되는 것이었는데, 문제 자체가 이게aaabaaa
일 때 앞에aaa
는 성립이 안된다는 말을 듣고 좀 헷갈렸는데, 결국 뒤에 동일한게 나와서 뒤의substring
s[4...6]
이 정답이라고는 하지만, 결국 Bool타입이기도하고, 만약에 뒤에aaa
대신aab
였으면 오히려 앞에있는aaa
가 맞게되는거라 어처피Bool
타입 판단에 있어서는 전혀 신경써줄 부분이 아니라는 것을 알게되어서 신경쓰지않고 풀이를 진행했다.
문제 풀이
class Solution {
func hasSpecialSubstring(_ s: String, _ k: Int) -> Bool {
var stack = 1 // 연속 된 수
var s = Array(s)
var now = s.removeFirst()
for item in s {
if item == now {
stack += 1
}
else {
stack = 1
now = item
}
if stack == k {
break
}
}
return stack == k ? true : false
}
}
이게 중간에 'cc'만 찾았다고 바로 true를 해버리니까 여기서 좀 에러가 발생했다.
그러면 끝까지보긴 봐야할 것이고, 언제 이것을 끊어줄거냐였는데, 그 부분은 오히려
now
랑 다를때, 즉else
를 타버렸을 때 정의해줬다.else { if stack == k { return true } stack = 1 now = item }
최종 제출 코드
class Solution {
func hasSpecialSubstring(_ s: String, _ k: Int) -> Bool {
var stack = 1 // 연속 된 수
var s = Array(s)
var now = s.removeFirst()
for item in s {
if item == now {
stack += 1
}
else {
if stack == k {
return true
}
stack = 1
now = item
}
}
return stack == k ? true : false
}
}
타인의 코드
class Solution {
func hasSpecialSubstring(_ s: String, _ k: Int) -> Bool {
let s = Array(s)
var count = 1
for i in 1..<s.count{
if s[i] != s[i-1]{
if count == k{
return true
}
count = 0
}
count += 1
}
return (count == k)
}
}
이미 만들어놓은 코드 구조를 유지하려다 보니, 앞에서 한 글자를 잘라주는 부분에만 신경을 썼고, 결국
1..<s.count
로 간단히 처리할 수 있는 것을 굳이 잘라주는 방식으로 구현한 점이 아쉬웠다.