본문 바로가기
IT/Algorithm

스택 - 짝이 맞지 않는 괄호

by 신인용 2020. 8. 20.
반응형

 

스택 - 짝이 맞지 않는 괄호

 

 

 

문제출저 - 알고스팟 https://algospot.com/judge/problem/read/BRACKETS2

 

 

 

 

 

풀이생각

1. 닫힌 괄호일 때 스택검사

 => 일치하면 pop, 다르면 바로 return false

2. 열린 괄호일 때 push

3. 함수 마지막에서 스택이 비어있다면 잘 끝난것 (true), 남아있다면 잘못된것 (false)

 

 

내 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <stack>
 
using namespace std;
 
 
bool func(string& s) {
    stack<char> st;
 
    int size = s.size();
    for (int i = 0; i < size++i) {
        if (s[i] == ')') {
            if (st.empty()) return false;
            if (st.top() == '(') {
                st.pop();
            }
            else {
                return false;
            }
        }
        else if (s[i] == '}') {
            if (st.empty()) return false;
            if (st.top() == '{') {
                st.pop();
            }
            else {
                return false;
            }
        }
        else if (s[i] == ']') {
            if (st.empty()) return false;
            if (st.top() == '[') {
                st.pop();
            }
            else {
                return false;
            }
        }
        else {
            st.push(s[i]);
        }
    }
 
    return st.empty();
}
 
int main() {
    int T;
    string s;
    cin >> T;
 
    while (T--) {
        cin >> s;
        bool res = func(s);
        res ? cout << "YES" << "\n" : cout << "NO" << "\n";
    }
}
cs

 

 

 

 

 

 

 

 

 

 

+) 추가 (시간 줄이는 삽질)

 

 

그런데 전에 푼 두 분은 C++로 4ms가 걸렸고, 나는 C++로 16ms가 걸렸다. 이유를 알아보기로 했다.

 

 

1. 테스트 케이스가 여는괄호부터 검사하는 것이 많아서 차이발생?

 -> 나는 닫는 것부터 검사하는데 두 분은 여는 것부터 검사했음

 결과 => 여는 것부터 검사했으나 똑같이 16ms가 나왔음

 

2. for문 안의 연산을 줄여보자.

 -> 그러나 empty, top, pop 모두 상수시간 연산이기에 줄일 수 있는게 보이지 않음

 

3. main을 고쳐보자.

 -> 함수결과를 변수 res에 대입하는 것과, bool ? : 연산을 if문으로 고쳐봄

 결과 => 16ms

 

4. main에 cin.sync_with_stdio(false); 추가

 결과 => 드디어 4ms 가 나왔다.

 -> 혹시 몰라서 위의 코드(원래 코드)에서 cin.sync_with_stdio(false)를 추가했다.

 결과 => 4ms가 나왔다.

 

 

 

 

cin.sync_with_stdio(false)는 printf나 scanf를 cout과 cin을 동기화시켜주는 것을 비활성화해서, cout과 cin을 써도 빨라진다고 배웠었다. 그런데 이런 차이를 불러올 지는 몰랐다.

 

 

 

 

 

 

 

 

반응형

'IT > Algorithm' 카테고리의 다른 글

이진 검색 트리  (0) 2020.08.23
트리 - 트리 순회 순서 변경  (0) 2020.08.22
선형 자료구조 - 조세푸스 문제  (0) 2020.08.18
선형 자료 구조 (동적 배열, 연결 리스트)  (0) 2020.08.17
탐욕법 - 도시락 데우기  (0) 2020.08.17

댓글