Search
Duplicate
📗

쇠막대기

주차
21
문제번호
10799
언어
티어
실버
유형
자료구조
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

문자열을 입력 받는다
입력 받은 문자열을 하나씩 stack에 저장
저장을 할때에 이전 문자가 ( 이고 현재 문자가 ) 일 경우 .으로 치환(레이저가 자르는 부분을 나타내기 위해)
stack을 순회
stack의 top부터 순차적으로 접근하기 때문에
) 을 만나면 stick의 개수 증가
. 을 만나면 그 동안의 stick을 답에 증가
( 을 만나면 stick의 개수 감소 및 답의 개수 하나 증가

놓쳤던 부분

stack의 크기만큼 순회를 하려고 s.size()를 for문 안에 사용.
문제는 for문 안에서 s.pop()연산이 있었기 때문에 s.size()가 고정되는 것이 아니라 계속 값이 변경되는 문제 발생
len = s.size()를 통해서 처음의 스택 길이 저장

코드

2300 KB

0 ms

#include <iostream> #include <stack> std::stack<char> s; std::string str; int answer = 0; void input_setting() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { std::cin >> str; } void solution() { int len = str.length(); int stick = 0; s.push('('); for (int i = 1; i < len; i++) { if(str[i] == ')' && str[i - 1] == '(') { s.pop(); s.push('.'); } else s.push(str[i]); } len = s.size(); for (int i = 0; i < len; i++) { if (s.top() == ')') ++stick; else if (s.top() == '.') answer += stick; else { ++answer; --stick; } s.pop(); } } void print() { std::cout << answer; } int main(void) { input_setting(); input(); solution(); print(); return (0); }
C++
복사