풀이과정

1. getline으로 괄호 내용을 입력받는다.
2. 앞에서 부터 문장을 읽는다.
3. '('이렇게 생긴 괄호를 스택에 넣는다.
4. ')' 이 괄호가 들어올 때 마다 스택에서 pop을 시킨다. (짝을 찾아 매칭)
5. 짝이 없거나, (가 없는데 )가 들어오면 그건 VPS가 아님.


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
#include<iostream>
#include<stack>
#include<string>
 
using namespace std;
 
stack<char> leftstack;
 
int main()
{
    int T;
    unsigned long i;
    string inputps;
 
    cin >> T;
    cin.ignore();
 
    while (T--)
    {
        getline(cin, inputps);
        for (i = 0; i < inputps.size(); i++)
        {
            if (inputps[i] == '(')
                leftstack.push(1);
            else if (inputps[i] == ')')
            {
                if (leftstack.empty() == true)  break;
                leftstack.pop();
            }
        }
        if (i == inputps.size()&&(leftstack.empty()==true)) cout << "YES\n";
        else cout << "NO\n";
        while (leftstack.empty() == false) leftstack.pop();
    }
    return 0;
}
cs



getline 사용문제:

https://haula.tistory.com/entry/%EB%B0%B1%EC%A4%80-BOJ-9093%EB%B2%88-%EB%8B%A8%EC%96%B4%EB%92%A4%EC%A7%91%EA%B8%B0-C-%ED%92%80%EC%9D%B4%EB%B2%95



풀이과정

1. getline을 통해 한줄 씩 받아와야함.
2. 테스트 케이스를 받은 다음 버퍼를 비워줘야함.
3. 거꾸로 출력해야하므로 선입후출 구조인 스택을 사용함.



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
#include<iostream>
#include<string>
#include<stack>
 
using namespace std;
 
int main()
{
    int T;        //테스트 케이스
    string sentence;    //문장 (길이 최대 1000) 단어길이: 20
    stack <char> st;    //단어를 뒤집기 위한 스택
 
    cin >> T;
    cin.ignore();    //버퍼 비우기
    while (T--)
    {
        getline(cin, sentence);
        sentence += ' ';
 
        for (int i = 0; i < sentence.size(); i++)
        {
            if (sentence[i] == ' ')
            {
                while (!st.empty())
                {
                    cout << st.top();
                    st.pop();
                }cout << ' ';
            }
            else 
                st.push(sentence[i]);
        }cout << "\n";
    }
 
}
cs


https://www.acmicpc.net/problem/10828



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
#include<iostream>
#include<stack>
#include<string>
 
using namespace std;
 
int main()
{
    stack <int> st;
    int N;
    string order;
 
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> order;
        if (order == "push")
        {
            int X;
            cin >> X;
            st.push(X);
        }
        else if (order == "pop")
        {
            if (st.empty() == true)
            {
                cout << -1 << "\n";
            }
            else 
            {
                cout << st.top() << "\n";
                st.pop();
            }
        }
        else if (order == "size")
        {
            cout << st.size() << "\n";
        }
        else if (order == "empty")
        {
            cout << st.empty() << "\n";
        }
        else if (order == "top")
        {
            if (st.empty() == truecout << -1 << "\n";
            else cout << st.top() << "\n";
        }
    }
}
cs


dfs공부할 때 


1. 테트로미노 https://www.acmicpc.net/problem/14500


분할정복 공부할 때


1. 별찍기 https://www.acmicpc.net/problem/2447


1476번 문항 날짜 계산문제 풀이법입니다.





제가 문제를 푼 순서입니다.


1. 변수를 하나 선언한다.

2. 그 변수를 계속해서 증가시킨다. 이와 동시에, E,S,M도 증가를 시킨다.

3. E,S,M 각각의 제한 연도를 넘기면 다시 1부터 센다.

4. 입력한 E,S,M와 일치할 때까지 카운팅을 한다.

5. 일치하면 카운팅을 중단하고 그 변수를 출력한다.

 

이렇게 풀어야겠다고 생각을 한 다음, 코딩을 진행했습니다.


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
#include<iostream>
 
using namespace std;
 
int main()
{
    int E, S, M;
    int count[3= { 0 };                                        
    int realyear = 0;
 
    cin >> E >> S >> M;
 
    while (1)
    {
        for (int i = 0; i < 3; i++)
        {
            count[i]++;                                                //E,S,M을 각각 1씩 증가시켜준다.
        }
        realyear++;                                                    //우리가 사용하는 연도도 1씩 증가시켜준다.
        if (count[0== 16) count[0= 1;                            //각 E,S,M 의 범위가 넘어가면 1부터 다시 센다.
        if (count[1== 29) count[1= 1;
        if (count[2== 20) count[2= 1;
        if (count[0== E && count[1== S && count[2== M)        //입력한 E,S,M의 값과 일치하는 순간
        {                                
            cout << realyear;                                        //출력하고
            return 0;                                                //프로그램을 마친다.
        }
    }
    return 0;
 
}
cs



정답확인 완료하였습니다.


+ Recent posts