Where who wants to meet someone

백준 Swift [4949] 균형잡힌 세상 본문

백준 알고리즘 문제 기록/스택, 큐, 덱

백준 Swift [4949] 균형잡힌 세상

Lust3r 2023. 8. 22. 17:29
728x90

난이도

실버 IV

 

문제

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

 

내 답안

while let input = readLine(), input != "." {
    var vpsStack = [Character]()
    var trash = [Character]()

    for character in input {
        switch character {
        case "(", "[":
            vpsStack.append(character)
        case ")":
            if vpsStack.last == "(" {
                vpsStack.removeLast()
            } else {
                trash.append(character)
            }
        case "]":
            if vpsStack.last == "[" {
                vpsStack.removeLast()
            } else {
                trash.append(character)
            }
        default:
            continue
        }
    }

    print(vpsStack.isEmpty && trash.isEmpty ? "yes" : "no")
}
  • 복잡한 코드와 수많은 if문을 보다 간결하게 바꾸자 해서 ), ]를 append하지 않고 removeLast를 해주기로 했다.
  • 1) input을 받고, "."이 아니라면 while 루프를 시작
    2) vpsStack과 trash 배열 초기화
    3) input의 각 캐릭터를 돌면서 (, [라면 vpsStack에 추가
    4) )라면 vpsStack의 last가 짝이 맞는 경우 removeLast, 맞지 않는다면 trash에 추가
    5) 4번과 캐릭터 조건만 다르고 동일
    6) for문이 끝나고 vpsStack과 trash가 비어있다면 yes, 아니라면 no를 출력
  • 처음엔 trash 없이 풀었는데 오답이 나왔다. 반례를 생각해보니 닫는 괄호들은 append를 하지 않고 짝이 맞을 경우에만 removeLast를 수행하는데, 닫는 괄호가 더 많이 나온 경우에는 어차피 처리가 되지 않으니 yes로 출력되는 문제가 있었다.
  • 이를 해결하기 위해 trash라는 배열을 넣어 이 경우에 대한 처리를 해주었다.