문제
리뷰
문제 맨 밑에 '힌트'를 읽고 이해 했다.
1부터 n 까지 수에 대해서는 반드시 push n번, pop n번이 수행되야 목표수열을 얻을 수 있다.
만약, 스택에 숫자가 남아있으면, 실패니까 "NO" 를 출력해야 한다.
1부터 n 까지 수를 차례로 push 한다.
for(i=1; i<=num; i++){ // 1 부터 n 까지 수는 반드시 들어온다.
st.push(i);
answer.push_back('+');
}
그러나 pop을 하려면 스택의 top이 목표수열의 숫자와 일치하는지 계속 확인해줘야 한다. 그래서 while문으로 만들었다.
pop을 할 때는 목표 수열의 다음숫자를 타겟으로 해야하니까 목표수열의 인덱스도 증가시켜줘야 한다는게 중요하다.
스택이 비어있으면 pop도 불가하니까, empty() 함수로 스택이 비었는지 확인한다.
for(i=1; i<=num; i++){ // 1 부터 n 까지 수는 반드시 들어온다.
st.push(i);
answer.push_back('+');
while(!st.empty() && (st.top() == N[idx])){ // 수열의 숫자와 같으면, pop
st.pop();
answer.push_back('-');
idx++; // 목표 수열의 인덱스도 증가시켜준다.
}
}
예를 들어, 입력받은 수열크기는 8이다. 목표 수열은 4 3 6 8 7 5 2 1 이다.
목표 수열은 4 3 6 8 7 5 2 1 이다. (현재는 idx = 0, N[idx] = 4 를 타겟으로 한다. )
1, 2, 3, 4 순으로 push 했다. (위의 코드로 보면 i가 4까지 진행된 상태다)
여기서 목표수열의 첫번째 숫자 4와 스택의 top 4 가 같아진다. 즉, while 문의 조건을 충족한다.
pop 한다.
목표수열의 다음 숫자 3 과 스택의 top 3이 또 같아진다.
(idx = 1로 바뀌면서 N[idx] = 3 이 된다. )
pop 한다.
다시 5, 6 순으로 push 한다.
while 문의 조건을 다시 확인한다.
**코드
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
int N[100001]; // 입력받은 수열
vector<char> answer; // 출력할 +, - 담을 벡터
stack<int> st;
int main(void){
freopen("input.txt", "rt", stdin);
int i, idx, num = 0;
scanf("%d", &num); // num 이하의 수열을 입력받자.
for(i=0; i<num; i++){ // 목표 수열 입력받기
scanf("%d", &N[i]);
} // 입력받기 끝
// answer에는 push 할 때 '+'를 넣고, pop 할 때 '-'를 넣는다.
for(i=1; i<=num; i++){ // 1 부터 n 까지 수는 반드시 들어온다.
st.push(i);
answer.push_back('+');
while(!st.empty() && (st.top() == N[idx])){ // 수열의 숫자와 같으면, pop
st.pop();
answer.push_back('-');
idx++; // 목표 수열의 인덱스도 증가시켜준다.
}
}
if(!st.empty()) printf("NO"); // 스택에 뭐가 남았다면 실패니까 "NO"
else{
for(i=0; i<answer.size(); i++){ // answer 에 담았던 문자들 순차출력
printf("%c\n", answer[i]);
}
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
ROT13 백준 11655 (0) | 2020.08.27 |
---|---|
에디터 백준 1406번 c++ (0) | 2020.08.26 |
2007년 백준 1924번 (0) | 2020.08.25 |
열 개씩 끊어 출력하기 백준 11721번 (0) | 2020.08.25 |
그대로 출력하기 백준 11718번 c++ (0) | 2020.08.24 |