99클럽 코테 스터디 7일차 TIL - 쇠막대기 (스택)

deun·2025년 4월 8일
1

99클럽 코테 스터디

목록 보기
7/20

문제: https://www.acmicpc.net/problem/10799

접근방식

레이저 ()는 그 시점에 열려 있는 막대 (를 모두 자르므로, 열려 있는 막대의 길이만큼 조각 수를 더한다. 하나의 막대가 2개의 레이저에 의해 잘린다면, 총 3개의 조각이 생기게 되므로 막대의 끝인 )을 만나면 조각 수를 1 추가한다.

이를 스택으로 구현하면 다음과 같이 작성할 수 있다.

  • (이라면 스택에 push한다.
  • )이라면 두 가지 케이스 중 하나이다.
    • 레이저인 경우 (이전 문자가 (인 경우)
      • 레이저의 시작(을 pop하고, 레이저가 지나가는 막대는 막대 시작(의 개수이므로 stack의 길이만큼 count 증가
    • 막대의 끝인 경우 (이전 문자가 )인 경우)
      • 막대의 시작(을 pop 하고 count를 1 증가

구현

const fs = require("fs")
const str = fs.readFileSync("/dev/stdin").toString().trim()

const stack = []
let count = 0
for (let i = 0; i < str.length; i++) {
  if (str[i] === '(') {
    stack.push('(')
  } else {
    stack.pop()
    count += str[i - 1] === '(' ? stack.length : 1
  }
}

console.log(count)

단계별 시뮬레이션

input: ()(((()())(())()))(())

단계문자이전문자스택 상태설명조각 수
1(null(막대 시작0
2)(레이저 → 스택 길이 0 → +00
3()(막대 시작0
4((((막대 시작0
5(((((막대 시작0
6((((((막대 시작0
7)((((레이저 → 스택 길이 3 → +33
8()((((막대 시작3
9)((((레이저 → 스택 길이 3 → +36
10))((막대 끝 → +17
11()(((막대 시작7
12((((((막대 시작7
13)((((레이저 → 스택 길이 3 → +310
14))((막대 끝 → +111
15()(((막대 시작11
16)(((레이저 → 스택 길이 2 → +213
17))(막대 끝 → +114
18))막대 끝 → +115
19()(막대 시작15
20((((막대 시작15
21)((레이저 → 스택 길이 1 → +116
22))막대 끝 → +117

trim()

입력 끝에 개행문자 \n가 붙어있어 입력 값에 trim을 적용하지 않으면 오답으로 처리됨...

profile
https://deun.dev

0개의 댓글