[231128] Today I Learned

YoungHyun Kim·2023년 11월 28일
1

TIL ✍️

목록 보기
6/68

[프로그래머스] 문자열 나누기

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
}

엄청 간단하다... 진짜 엄청나다...

여기서 처음 알게된 사실이 있다면,

  1. 삼항연산자에는 +, -, *, /, % 등의 연산자 뿐만이 아닌 +=, -= 등의 단축된 연산자도 사용할 수 있다.
  2. 서로 다른 경우를 카운트할 때, 하나의 변수로 더하고 빼는 작업을 반복하면서 이를 구현할 수 있다.

솔직히 다른 고차함수가 즐비한 풀이를 보면서 감탄하기도 했지만, 나는 앞으로 이 풀이를 적어내신 분처럼 창의적이고 간단한 코드를 만들어 내는 개발자가 되고 싶다고 생각했다.


기초 문법

  1. 옵셔널 바인딩 if let param1 = "", let param2 = "" 과 같이 두 개의 변수를 한 번에 바인딩할 수 있다.

  2. guard let param = randomValue else { ~~~ }와 같이 guard문을 활용해서 옵셔널 바인딩이 가능하다.

  3. set1.intersection(set2), set1.union(set2), set1.substracting(set2), set1.symmetricDifference(set2) 등의 기능을 잘 알아두면 알고리즘등의 문제를 푸는데 많은 도움이 될 것 같다!

profile
iOS 개발자가 되고 싶어요

0개의 댓글