Algorithm/Problem Solve

[백준1874번] 스택 수열

아네스 2020. 12. 11. 11:41
반응형

1.

vector.back()을 사용햇었는데, empty check를 해주지 않으면 비어있을때 undefined behavior를 해서 어떻게 될 지 모름.

 

2.

그리고 cout << endl로 하니까 시간초과나고 cout << '\n'을 쓰니 시간초과 안나더라. 무슨차이일까.

#include <bits/stdc++.h>

using namespace std;

vector<int> v; 			//주어지는 input 담을 벡터
vector<int> v_temp;		// while문 안에서 사용할 벡터. 
vector<int> v_res;		// 결과 담을 벡터 (나중에 v와 비교)
vector<char> v_oper;	// '+', '-' 담을 벡터.
int N;
bool flag =0; 			// operators를 출력할건지, NO를 출력할건지 flag
void permutation(){
    
    int d = 1;			//1부터 시작
    int v_pointer = 0;	// vector v의 index로 사용할 point
    while(1)
    {
        if(d >N) break;	//주어진 N보다 더 많이 돌진 않음.
        v_temp.push_back(d);	// d를 한번 넣어보고
        v_oper.push_back('+');	// operator에 일단 저장.
        while(!v_temp.empty() && v[v_pointer] == v_temp.back())	
        // *주의 v_temp가 빈경우back을 탐색하면 어떤일이 일어날지 모름. 이거때문에 틀렸었음.
        // 현재 비교해야되는v[v_pointer]랑 시험삼아 d 담아본 v_temp의 마지막꺼랑 같은동안에
        {
            v_res.push_back(v_temp.back());	// result를 푸쉬하고
            v_temp.pop_back();				// 기존 temp껀 팝한다.
            v_oper.push_back('-');			// pop했으니 '-'를 푸쉬하고
            v_pointer++;					// 그다음껄 확인한다.(팝한것의 아래꺼.)
        }
        
        if(d == N && v == v_res) {			// N만큼 돌았고, 쌓인 v_res가 input으로 받은 v와 같다면
            flag = 1;
            break;
        }
        d++;
        
    }
}
int main(void)
{
    cin >> N;
    for(int i =0; i<N; i++)
    {
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }
    permutation();
    if(flag ==1 )
    {
        for(int i = 0 ; i< v_oper.size(); i++)
        {
            cout <<v_oper[i] << "\n"; 		//주의. <<endl로 하면 시간초과난다.
        }
    }else{
        cout << "NO";
    }
    
}
반응형

'Algorithm > Problem Solve' 카테고리의 다른 글

[백준 1157번] 단어 공부  (0) 2020.12.11
[백준 1920번] 수 찾기  (0) 2020.12.11
[백준1260번] BFS와 DFS  (0) 2020.12.09
[백준 1654번] 랜선자르기  (0) 2020.12.08
[백준 1152번] 단어의 개수  (0) 2020.12.07