[백준/Silver II] 쇠막대기 - 10799

2024. 5. 28. 02:13·알고리즘/백준
728x90
import Foundation

let input = readLine()!
var stack = [Character]()
var pieces = 0
let characters = Array(input)

for i in 0..<characters.count {
    if characters[i] == "(" {
        stack.append(characters[i])
    } else {
        stack.removeLast()
        if characters[i-1] == "(" {
            // Laser, add the number of open rods
            pieces += stack.count
        } else {
            // End of a rod, add one piece
            pieces += 1
        }
    }
}

print(pieces)

문제 설명

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

  • 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.
  • 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
  • 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.

아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.

  1. 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반드시 레이저를 표현한다.
  2. 쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.

위 예의 괄호 표현은 그림 위에 주어져 있다.

쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.

쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.

입력

한 줄에 쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 공백없이 주어진다. 괄호 문자의 개수는 최대 100,000이다.

출력

잘려진 조각의 총 개수를 나타내는 정수를 한 줄에 출력한다.

 

문제풀이

  1. 입력 처리:
    • 입력 문자열을 배열로 변환하여 처리합니다.
  2. 스택 처리:
    • '(' 문자를 만나면 스택에 추가합니다.
    • ')' 문자를 만나면 스택에서 하나를 제거합니다.
    • ')' 문자 앞에 '('가 있으면 레이저로 판단하여 현재 스택에 남아있는 '('의 수를 조각 수에 더합니다.
    • 그렇지 않으면 쇠막대기의 끝으로 판단하여 하나의 조각을 추가합니다.
728x90

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

[백준/Gold IV] 오큰수 - 17298  (1) 2024.06.25
[백준/Silver IV] 덱 - 10866  (0) 2024.05.23
[백준/실버Ⅳ] 큐 - 10845  (1) 2024.05.16
[백준/Silver II] 스택 수열 - 1874  (0) 2024.05.14
[백준/Bronze I] 단어 뒤집기 - 9093  (0) 2024.05.11
'알고리즘/백준' 카테고리의 다른 글
  • [백준/Gold IV] 오큰수 - 17298
  • [백준/Silver IV] 덱 - 10866
  • [백준/실버Ⅳ] 큐 - 10845
  • [백준/Silver II] 스택 수열 - 1874
bulmang
bulmang
모바일 개발자 도전
  • bulmang
    bulmang
    bulmang
  • 전체
    오늘
    어제
    • 분류 전체보기 (208)
      • 알고리즘 (68)
        • List (3)
        • Two Pointer (6)
        • Binary Search (4)
        • Prefix Sum (3)
        • Sort (4)
        • Brute Force (5)
        • Array (2)
        • String (4)
        • 프로그래머스 (12)
        • 백준 (9)
        • Queue (2)
        • Stack (2)
        • Recursion (12)
      • Computer Science (16)
        • Computer Architecture (6)
        • Operating System (5)
        • Network (2)
        • 기타 (2)
        • System Programming (1)
      • Swift (70)
        • 개발 (24)
        • 정리 (25)
        • 문법 (20)
      • Flutter (24)
      • 기타 (12)
        • 후기 (12)
      • Git (6)
      • Ios 오픈소스 (5)
      • UI 디자인 (5)
      • AppleScript (2)
  • 링크

    • Notion
    • Github
  • 태그

    IOS
    til
    협업
    today i learned
    Swift
    SwiftUI
    개발
    재귀
    피플
    Java
    자료구조
    알고리즘
    FLUTTER
    코딩테스트
    백준
    riverpod
    Apple Developer Academy
    컴퓨터구조
    문법
    Xcode
  • 최근 댓글

  • 최근 글

  • 인기 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.2
bulmang
[백준/Silver II] 쇠막대기 - 10799
상단으로

티스토리툴바