https://www.acmicpc.net/problem/1874
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net

// 코드
#include <bits/stdc++.h>
using namespace std;
int main(){
stack<int> s;
int N, cnt = 0;
string c;
cin >> N;
int num[N];
for(int i = 0; i < N; i++) cin >> num[i];
// 배열에 N개의 수 저장
for(int j = 0; j <= N; j++){
// j가 1부터 시작해서 첫번째에 pop()이 선언되면 종료되기 때문에 0부터 시작
s.push(j); // 스택에 j 삽입
if (j != 0) c += '+'; // j가 0이 아닐때만 c에 '+' 추가
while(true)
{
if(s.top() == num[cnt]){
// 스택에 마지막으로 들어간 값이 num[cnt]와 같을때
c += '-'; // c에 '-' 추가
s.pop(); // 해당 스택 값 삭제
cnt++; // cnt 1 증가
}
else break; // 아니라면 while문 종료
}
}
if(cnt < N) cout << "NO"; // cnt
// 위 반복문이 종료됐는데 cnt == N이 아니라면 만들수없는 수열을 입력한것
else for(auto a : c) cout << a << '\n';
// '+' 와 '-'를 저장한 string 출력
return 0;
}
// 리뷰
다른 부분은 할만하지만 "NO"를 출력하는 부분은 조금 생각해봐야 했다.
입력한 수열이 스택으로 만들 수 있는 수열이라면 N개의 수가 삭제되고 반복문을 나온다.
그러면 cnt와 N이 같지 않다면 만들 수 없는 수열이므로 "NO"를 출력하면 된다.
'기타' 카테고리의 다른 글
| [TIL] 2023-12-20 (0) | 2023.12.20 |
|---|---|
| [백준/C++] 1436 영화감독 숌 (0) | 2022.06.23 |
| [백준/C++] 1259번 팰린드롬수 (0) | 2021.12.04 |
| [C++] 여러가지 피라미드 코드 ( 왼쪽 위, 아래 && 오른쪽 위, 아래 ) (2) | 2021.12.03 |
| [백준/C++] 5397번 키로거 List (1) | 2021.12.03 |