반응형
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 |