본문 바로가기

알고리즘까먹지말게

STL Stack 이것저것 사용

과제2: HTML Tags Matching Stack 구현 

과제를 못해서 점수가 0.5점이네 ;; ㅋㅋ 밤샜는데 결국 못했던 기억 ,, 

그정도로 어려운거 백퍼 아니었을텐데 그냥 못했겠지 뭐 ,,

어쩄던간에 , ,~~~ 시작해보겠습니다.

실제 과제는 stl을 사용 못하게 했었음,, 근데 굳이 이럴필요가 없으니 난 걍 썼음 ㅋ

일단 맞는지는 모르겠지만 테스트케이스가 다 잘 돌아가니 됐다고 생각하고

이거 태그매칭 스택으로 구현하는거 되게 많은데 보통은 <이거 찾아서 넣고 >찾아서 팝하고 끝나는건데

우리 과제는 좀 더 복잡했다 저거 개수 아니고  태그 쌍으로 위치까지 봐야 되는 그런..?? 

예시 6같은 경우가 그냥 push pop으론 찾기 어렵고 문자까지 봐야 되는 경우. . .

 

스택 사용하는거 알았으니 되었다구 생각할 예정 . .~ 벡터stl은 언제써도 존나 구글링해서 이터레이터 씀 ㅋㅋ 맨날까먹

뭔가 이상하긴 한데 .. . 

#include<iostream>
#include<string>
#include<stack>
using namespace std;

/*
 이딴식으로 해도 되는지는 모르겠으나, , 
 뭐 돌아가니까. ..   
 스택사용연습. .
*/
// /가 들어오면 top이랑 비교해서 같으면 pop
// <다음에 문자면 그거 tags 스택에 넣음
// < 다음에 /라면 /다음 문자 sk 스택에 넣음
// sk에 넣을 때마다 tags의 top과 비교 둘이 같으면 tags pop시킴
//tags가 empty라면 correct ,아니라면 짝꿍 안맞는거니까 incorrect
// 중간에 incorrect들은 예외잡기용




    bool isHtmlMatched() {
        char open;
        char open_2;
        stack<char> tags;
        stack<char> sk;
        string st;


            cin >> st;

            for (int i = 0; i < st.length(); i++) {

                if (st.at(1) == '/') {
                    //애초에 여는태그면 false

                    //       cout << "incorrect " << endl;
                    return false;

                }


                //open tag
                if (st.at(i) == '<')
                {

                    if (st.at(i + 1) != '/') {

                        open = st.at(i + 1);
                        tags.push(open);

                    }
                    else {
                        // 닫는태그(/) 라면
                        open_2 = st.at(i + 2);

                        sk.push(open_2);


                        if (tags.empty())  return false;//cout << "incorrect" << endl;



                        if (tags.top() == sk.top()) {

                            tags.pop();

                            //뭣도 없으면 incorrect 
                            if (sk.empty()) {

                                return false;
                                //cout << "incorrect" << endl;
                            }


                        }


                    }



                }

            }
            if (tags.empty()) {

                return true;
                //cout << "correct" << endl;

            }
            else {
                return false;
                //cout << "incorrect" << endl;
            }

        
      }
   


    int main() {

        bool flag = true;
        
        int num;
        
        cin >> num;


        for (int i = 0; i < num; i++) {

            flag = isHtmlMatched();
           
            if (flag == true) {

                cout << "correct" << endl;
            }
            else {

                cout << "incorrect" << endl;
            }
        }


        return 0;
    }

 

 

 

 

 

 

 

 

 

 

 

'알고리즘까먹지말게' 카테고리의 다른 글

드디어 BFS/DFS 해보겠습니다.  (0) 2020.08.06
자료구조 이것저것 정리  (0) 2020.07.28
자구 4번째 과제(infix to postfix)  (0) 2020.07.28
Single LinkedList 기초  (0) 2020.06.03
STL 간단 정리  (0) 2020.06.02