1️⃣ 문제

문제 - 짝지어 제거하기

2️⃣ 풀이 방법 및 코드

처음에는 while 문을 이용하여 짝지은 문자열을 발견하면 삭제하고, 다시 첫 인덱스부터 검사하여 array가 빌 때까지 하도록 제어했지만, 효율성을 통과하지 못했다.

while문 안에서 스택을 이용해도 마찬가지!

다시 생각해보니 스택을 이용하면 for문으로 충분할 거 같아서 바꾸니 성공하였다.

for문으로 str 배열 접근 시 stack의 top과 같다면, 스택을 pop하고

아니라면, stack에 삽입하는 방식!

stack이 비었다면 모두 짝지은 문자열이므로 1을 반환, 아니면 0 반환

소스 코드

import Foundation

func solution(_ s:String) -> Int{
    var str = Array(s)
    var stack = [Character]()
    
    for c in str {
        if stack.isEmpty { stack.append(c) }
        else {
            if stack.last! == c { stack.removeLast() }
            else { stack.append(c) }
        }
    }
    
    return stack.isEmpty ? 1: 0
}

3️⃣ 이 문제를 풀면서 되새긴 점

문자열을 Array로 만들기

map vs Array()

늘 map 함수로 문자열을 배열로 만들곤 했었는데, Array()로 컨버팅을 해주면 Character 원소를 가진 배열로 컨버팅할 수 있음을 알게 되었다.

isLetter 또는 isNumber 등 Character만 가지고 있는 프로퍼티를 쓸 일이 있을 때는 Array()를 이용하여 문자열을 배열로 만들어줘야겠다.

let s = "Hello Swift"
var arr = s.map { String($0) }	// [String]
var arr = Array(s)	// [Character]