[Swift] 프로그래머스, 문자열 압축
문제 링크
잡담
아.. 문제 눌렀는데, 카카오 2020 공채 문제라고 뜨길래 식겁했습니다… 😅 시작 전부터 기에 눌려서 풀 수 있을까라는 생각이 들었는데, 풀긴 풀었네요..
문자열을 다루는 문제라서 확실히 Swift로는 풀기 힘들다고 느껴졌어요.. 뭔가 파이썬으로 했으면 더 쉽고 간단하게 하지 않았을까라는 생각이 많이 들었습니다.
풀이
String을 쪼개야하는데, 일단 받은 문자열을 Array에 넣어서 쪼개줬어요
// s는 String
Array(s)
이렇게 넣으면 character로 쪼개지더라구요! 이 상태에서 배열을 map해서 String으로 변환해줬습니다.
그 다음엔 reduce를 사용해서 분할하는 길이 만큼 String을 재생성 해줬어요
sum = list[index...list.count-1].reduce("", {
$0+$1
})
이렇게 쪼개는 길이만큼만 분할해서 합쳐줬습니다. 뭔가 이 부분이 뿌듯하더라구요 ㅋㅋㅋ 고차함수를 필요한 타이밍에 잘 쓴 느낌 ㅎㅎ
그런 다음은 뭐.. 그냥 인덱스를 증가시키면서 조건에 따라 붙이고 그냥 그런.. 알고리즘은 딱히 필요없고, 반복문을 도는 형태로 구현하게 되었습니다.
구현 문제라서 그런지 딱히 알고리즘은 필요 없었던 것 같아요! 하지만 계속 조건문을 추가하다보니 depth가 좀..
코드
//
// main.swift
// 문자열압축
//
// Created by 남기범 on 2020/12/26.
// Copyright © 2020 남기범. All rights reserved.
//
import Foundation
func solution(_ s: String) -> Int {
let arr = Array(s).map { String($0) }
var result = arr.count
for i in 1...arr.count {
let resultString = zip(length: i, list: arr)
result = min(result, resultString.count)
}
return result
}
func zip(length: Int, list: [String]) -> String {
var result = ""
let volum = length-1
var index = 0
var before = ""
var count = 1
while index < list.count {
var sum = ""
if index + volum >= list.count-1 {
sum = list[index...list.count-1].reduce("", {
$0+$1
})
} else {
sum = list[index...index+volum].reduce("", {
$0+$1
})
}
if before == sum {
count += 1
if index + volum >= list.count-1 {
if count != 1 {
before = String(count) + before
}
result.append(before)
}
} else {
if count != 1 {
before = String(count) + before
}
result.append(before)
before = sum
count = 1
if index + volum >= list.count-1 {
result.append(before)
break
}
}
index += length
}
return result
}