문제 소개
10799번: 쇠막대기
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저
www.acmicpc.net
아래와 같이 ()로 이루어진 문자열이 주어졌을 때, 막대기는 몇조각으로 나뉠수 있는지를 물어보는 문제이다.
![](https://blog.kakaocdn.net/dn/bXb6WI/btsGAxKy0Ys/Rno2kPG08BDGHRk4Zd8Vx0/img.png)
문제 풀이
텍스트 대치 활용
레이저를 "-" 로 바꿔준다음 "(" 가 나오게 된다면 막대기의 갯수를 더해주고, ")" 가 나오게 된다면 막대기의 갯수를 빼주고 count에 1을 더해주면 된다. 그리고 "-" 레이저가 나왔을때에는 총 조각의 count에 현재 막대기의 갯수를 더해준다. replacingOccurrences라는 것을 활용하면 쉽게 풀 수 있다.
import Foundation
let input = readLine()!.replacingOccurrences(of: "()", with: "-")
var bar = 0
var count = 0
for chr in input {
switch chr {
case "(":
bar += 1
case ")":
count += 1
bar -= 1
default:
count += bar
}
}
print(count)
스택 사용
위와 비슷한 원리이다. ")"가 나왔을때 바로앞이 "("라면 레이저로 생각한다.
import Foundation
let input = readLine()!
var stack = [String]()
var count = 0
for i in input.indices {
if input[i] == "(" {
stack.append(String(input[i]))
} else {
let index = input.index(i, offsetBy: -1)
if input[index] == "(" {
stack.removeLast()
count += stack.count
} else {
stack.removeLast()
count += 1
}
}
}
print(count)
가독성은 위에가 훨씬 좋지만 replacingOccurrences를 사용하면서 문자열이 길어질수록 좀더 시간이 걸릴 듯 싶다.
'→ Problems' 카테고리의 다른 글
[Algorithm] 백준 - 1918번 후위표기식 (postfix) (0) | 2024.04.14 |
---|---|
[Algorithm] 백준 - 17299번 오등큰수 (Swift) (0) | 2024.04.13 |
[Algorithm] 프로그래머스 - 디펜스 게임 (Swift) (Heap, Parametric Search) (0) | 2024.04.05 |
[Algorithm] 프로그래머스 - 시소 짝궁 (Swift) (0) | 2024.04.04 |
[Algorithm] 프로그래머스 - 뒤에 있는 큰 수 찾기 (Swift) (1) | 2024.04.03 |