티스토리 뷰

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net


문제 요약

  • 붙어있는 열린 괄호와 닫힌 괄호 " () "를 레이저, 나머지 열린 괄호와 닫힌 괄호를 쇠막대라 생각하자.
  • 레이저로 쇠막대기를 잘라서 나오는 조각의 총개수를 구하라.

풀이

  • 이전에 풀었던 BOJ 9012번 괄호를 참고했다.
  • 입력받은 문자열을 반복문으로 확인한다. 열린 괄호는 스택에 넣고 닫힌 괄호를 만날 때마다 pop 한다. 
  • 닫힌 괄호가 나왔을 때는 이전 문자가 열린 괄호라면 레이저이다. 스택에 존재하는 열린 괄호(= 쇠막대 개수)를 자른다고 스택의 원소 개수만큼 result에 더해준다.
  • 닫힌 괄호가 나왔을 때 이전 문자가 닫힌 괄호라면 쇠막대기 끝이고, 레이저로 자른 조각 한 개가 남아 있으므로 result에 1을 더해준다.

import Foundation

let input = readLine()!.map{ String($0) }
var stack: [String] = []
var last: String = ""
var result: Int = 0

// var check: Int = 0

for i in input {
    // check += 1
    if i == "(" {
        stack.append(i)
    } else if i == ")" {
        stack.removeLast()
        if last == ")" {    // 쇠막대기 끝 발견
            result += 1
        } else {            // 레이저 발견
            // print("레이저 발견")
            result += stack.count
        }
    }
    last = i
    // print("\(check)번째 - stack: \(stack), result: \(result)")
}

print(result)

 

'Algorithm > 백준' 카테고리의 다른 글

[BOJ] (Swift) 17298 - 오른수  (0) 2022.08.04
[BOJ] (Swift) 1935 - 후위 표기식 2  (0) 2022.08.03
[BOJ] (Swift) 17413 - 단어 뒤집기 2  (0) 2022.08.03
[BOJ] (Swift) 10866 - 덱  (0) 2022.08.02
[BOJ] (Swift) 1158 - 요세푸스 문제  (0) 2022.08.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함