https://www.acmicpc.net/problem/1874
스택 문제에서 조금 더 꼬아본 문제.
풀 때는 오래걸렸는데 스택의 기본 개념을 고려하면 쉽게 풀 수 있던 문제였다.
불가능한 경우는 입력값(pop했을 때의 값)이 stack[top]과 다른 경우가 되겠다.
push와 pop이 각 n번씩 수행되고 n번 입력하므로 O(3n) = O(n)으로 풀 수 있다.
stack용 배열 하나와 예제 출력에 불가능한 경우 NO, 가능한 경우에만 +, -로 표현하도록 되어 있으니 출력용 배열을 하나 더 만들었다.
#include <cstdio>
int stack[100000] = { 0 };
char out[200000] = { 0 };
int main()
{
int n, in = 0, stTop = 0, outTop = 0;
// in = 스택에 삽입할 자연수(1부터 차례대로)
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int num;
scanf("%d", &num);
// 받는 값은 n값 이상이 될 수 없다.
if (num > n)
{
printf("NO\n");
return 0;
}
// 스택에 삽입할 자연수가 num보다 낮으면 push
// push는 최대 n번까지 수행한다.
if (in < num)
{
for (int j = in; j < num; j++)
{
stack[stTop++] = ++in;
out[outTop++] = '+';
}
}
// 스택에 num값과 같을 때까지 자연수를 삽입하면 pop을 수행한다.
if (num == stack[stTop - 1])
{
stack[--stTop] = 0;
out[outTop++] = '-';
}
// num값과 stack[stTop]이 다르면 잘못된 경우이다.
else
{
printf("NO\n");
return 0;
}
}
// 저장했던 +, -를 전부 출력한다.
for (int i = 0; i < outTop; i++)
printf("%c\n", out[i]);
return 0;
}'알고리즘' 카테고리의 다른 글
| 알고리즘의 정당성 증명 (0) | 2017.08.10 |
|---|---|
| BOJ [1676] 팩토리얼 0의 갯수 (0) | 2017.08.10 |
| BOJ [3344] N-Queen (0) | 2017.08.10 |
| BOJ [1011] Fly me to the Alpha Centauri (0) | 2017.08.10 |
| BOJ [1463] 1로 만들기 (0) | 2017.08.10 |