요구능력
문자열 완전탐색
문제풀이
문제의 조건대로 문자열을 압축한다고 생각을 해보면 굳이 현재문자열의 절반을 넘는부분까지 개수를 해볼 필요가 없다.
예를들어서 abcabc가 있다.
이 문자열을 4개단위로 잘라서 압축하는게 의미가 없을것이다.
이 문제에서는 이런 그리디한 부분까지는 원하지 않은것같다.
절반이상까지 탐색해도 정답이니.. 거를방법이 없던걸수도..?
실제로 arr.count / 2 를 arr.count로 해도 정답이 나온다.
1개단위 ~ 문자열의 절반까지 압축을 할것이다.
그런데, 문제에서 적은 2a2ba3c와 같은 형태로 만들어야 result값을 리턴할 수 있겠다.
그럼 문자열을 저장하기위해 comp 프로퍼티를 하나 생성해준다.
그리고 2a2b와 같이 나타내려면 현재 내가 자르고있는 문자열이 몇개째인지도 세줘야한다.
그러기 위해서 count프로퍼티를 생성해주었다.
그리고 temp 변수를 생성해준 이유는 현재 자른 문자열을 저장하기 위해서 생성해주었다.
이제 문자열을 자르는 작업을 해보는데,
step씩 자르면서 arr.count까지 가면 현재까지온 인덱스(j) + step을 하면 j + step이 문자열을 넘어가는 상황이 나타난다.
이 부분을 처음에 to: arr.count - step 까지 해봤는데,
aabbaccc에서 3개씩 자르게되면 aabbac까지만 나타나더라.
그래서 endIndex를 넣어주었다.
이전에 잘랐던 부분(temp)가 현재 자르는 부분(arr[j...idx])와 같으면 count를 1개올려주는데, 같지않은데 count가 2개이상이면 문제에서 보여준데로 문자열앞에 count를 적어주고 뒤에 문자열을 적어준다.
2개이상아니면 적을 숫자가 없으니 그냥 문자열을 적어준다.
그리고 temp를 바꿔주고 count를 다시 1로 초기화해준다.
마지막에 위 작업을 한번 더 해주는데, 1개씩 자르는데 문자열이 cc 이렇게 있으면 else문을 안들어가고 count만하고 내려오게된다. 그 마지막부분을 처리해주기위해서 if count>=2이 부분을 한번 더 해준것이다.
if temp == arr[j..<idx]{
count += 1
}else{
if count >= 2{
comp += "\(count)" + temp
}else{
comp += temp
}
temp = arr[j..<idx]
count = 1
}
}
그리고 마지막으로 가장 짧은 문자열을 return하기 위해서 min()함수를 사용해서 처리했다.
후기
처음에 마지막에 준 예제를 못보고 xabcabc이런것도 되는줄 알고 고민하다가 몇시간을 보냈는지..
코드
func solution(_ s:String) -> Int {
let arr = Array(s)
var result = Int.max
if arr.count == 1{
return 1
}
for step in 1...arr.count/2{
var comp = ""
var count = 1
var temp = arr[0..<step]
for j in stride(from: step, to: arr.count, by: step){
var idx = j + step
if j + step > arr.count - 1{
idx = arr.endIndex
}
if temp == arr[j..<idx]{
count += 1
}else{
if count >= 2{
comp += "\(count)" + temp
}else{
comp += temp
}
temp = arr[j..<idx]
count = 1
}
}
if count >= 2{
comp += "\(count)" + temp
}else{
comp += temp
}
result = min(result, comp.count)
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][math] 멀쩡한 사각형 (0) | 2022.04.25 |
---|---|
[Swift][프로그래머스][해시] 오픈채팅방 (0) | 2022.04.22 |
[Swift][프로그래머스][그리디] 체육복 (0) | 2022.04.20 |
[Swift][프로그래머스][해시] 베스트앨범 (0) | 2022.04.19 |
[Swift][프로그래머스][완전 탐색] 카펫 (0) | 2022.04.18 |
댓글