Where who wants to meet someone
백준 Swift [4949] 균형잡힌 세상 본문
728x90
난이도
실버 IV
문제
https://www.acmicpc.net/problem/4949
내 답안
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라는 배열을 넣어 이 경우에 대한 처리를 해주었다.
'백준 알고리즘 문제 기록 > 스택, 큐, 덱' 카테고리의 다른 글
백준 Swift [2164] 카드2 (0) | 2023.08.25 |
---|---|
백준 Swift [12789] 도키도키 간식드리미 (2) | 2023.08.24 |
백준 Swift [9012] 괄호 (0) | 2023.08.22 |
백준 Swift [10773] 제로 (0) | 2023.08.22 |
백준 Swift [28278] 스택 2 (0) | 2023.08.22 |