Legacy/Be Refactoring..

acmicpc.net / 알고리즘 기초 1/2 - No.10799 - 쇠막대기

Marco 2020. 7. 16. 21:28
728x90

알고리즘 기초 1/2 - No.10799 - 쇠막대기

 

TODO

- 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다.

- 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다.

- 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다.

- 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않습니다.

 

Constraints

0 ≦ S  100,000

 

Sample Input

()(((()())(())()))(())

(((()(()()))(())()))(()())

 

Sample Output

17

24

 

#include <string>
#include <iostream>
#include <vector>

using namespace std;


int main() {
    vector<int> pieces;

    string str;
    cin>>str;

    int answer=0;

    for(int i=0; i<str.size(); i++) {
        if(str[i]=='(') {
            pieces.push_back(str[i]);
        } else {
            pieces.pop_back();
            if(str[i-1]=='(') {
                answer += pieces.size();
            } else { 
                answer++;
            }
        }
    }
    cout<<answer<<"\n";
}

How I tried this :

사실 괄호 갯수 2개일때 해결 하는 함수 재귀함수 생각도 해보고

index 층을 쌓아서 층마다 적용되는 (막대기마다) 레이져 갯수 찾아서 나누기 등등 

다양하게 고민했지만 너무나 복잡해서 해결해내지 못했다..

살짝 팁을 얻으려고 검색해본 첫 블로그가 ')' 만났을때 레이져면 막대기 갯수/ 막대기 끝나는거면 +1개  알려줫는데.. 너무나 쉽게 풀려버림...

이틀간 계속 도전하다 허탈..

 

정답을 아는거보다 1000줄로라도 풀었어야 맞는건지. 풀고 허탈감에 빠지는게 맞는건지...

 

프로그래머스로 접하고 복붙할뿐인데 잘풀렸다. 특별한건 없지만

 

What I got is : 

Main.cc: In function ‘int main()’:
Main.cc:16:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
     for(int i=0; i<str.size(); i++) {
                  ~^~~~~~~~~~~

경고 뜬 채로 맞긴했지만 찝찝함.. 

 

I have to study :

 

경고 해결해보기

728x90
댓글수0