import Foundation
func solution(_ s:String) -> Int {
var input = Array(s), cnt = 0, ccnt = 0, result = 0, temp = "", trashCan = ""
for char in s {
if cnt == 0 || temp == String(char) {
temp = String(char)
trashCan = String(input.removeFirst())
cnt += 1
if input.count == 0 {
result += 1
}
continue
} else if String(char) != temp {
ccnt += 1
trashCan = String(input.removeFirst())
if cnt == ccnt {
cnt = 0
ccnt = 0
result += 1
} else if input.count == 0 { // cnt와 ccnt가 다르지만, 더 이상 비교할 요소가 없다면 result에 1을 더하고 프로그램 마무리
result += 1
}
continue
}
}
return result
}
위의 코드로 문제를 해결했는데... 문제를 해결했을 때는 뿌듯했으나, 프로그래머스 사이트 특성 상 문제 해결 후 다른 사람의 풀이를 볼 수 있고 거기엔 대현자님들이 즐비했다.
일단 나는 카운트 변수를 두 개 선언한 후 분기문 안에 분기문을 작성하는 등, 가독성이 매우 떨어지는 코드를 작성했다.
대 현자님들은 고차함수도 능숙하게 사용하시며 문제를 엄청 간단하게 풀어냈는데, 내가 제일 놀란 풀이는 다음 풀이다.
import Foundation
func solution(_ s:String) -> Int {
var answer = 0
var x: Character? = nil
var xCount = 0
for i in s {
if x == nil {
x = i
xCount = 1
answer += 1
continue
}
xCount += x == i ? 1 : -1
if xCount == 0 {
x = nil
}
}
return answer
}
엄청 간단하다... 진짜 엄청나다...
여기서 처음 알게된 사실이 있다면,
솔직히 다른 고차함수가 즐비한 풀이를 보면서 감탄하기도 했지만, 나는 앞으로 이 풀이를 적어내신 분처럼 창의적이고 간단한 코드를 만들어 내는 개발자가 되고 싶다고 생각했다.
옵셔널 바인딩 if let param1 = "", let param2 = ""
과 같이 두 개의 변수를 한 번에 바인딩할 수 있다.
guard let param = randomValue else { ~~~ }
와 같이 guard
문을 활용해서 옵셔널 바인딩이 가능하다.
set1.intersection(set2), set1.union(set2), set1.substracting(set2), set1.symmetricDifference(set2)
등의 기능을 잘 알아두면 알고리즘등의 문제를 푸는데 많은 도움이 될 것 같다!