πŸ™‡β€β™€οΈ[Silver II] μŠ€νƒ μˆ˜μ—΄ - 1874

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2948 KB, μ‹œκ°„: 20 ms

λΆ„λ₯˜

자료 ꡬ쑰, μŠ€νƒ

제좜 일자

2023λ…„ 12μ›” 17일 15:52:50

문제 μ„€λͺ…

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ 가지고 μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫 쀄에 n (1 ≀ n ≀ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 주어진닀. λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

좜λ ₯

μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

</br>

πŸš€ν’€μ΄

이 문제λ₯Ό ν’€ λ•Œ queue, stack을 μ΄μš©ν•΄μ„œ ν’€μ—ˆλ‹€.
μŠ€νƒμ—μ„œ pop을 ν•΄μ„œ νŠΉμ •ν•œ μˆ˜μ—΄μ„ λ§Œλ“€μ–΄μ•Όν•˜λŠ”λ° 예λ₯Όλ“€μ–΄
{ 4 3 6 8 7 5 2 1 }
μ΄λΌλŠ” μˆ˜μ—΄μ„ λ§Œλ“€μ–΄μ•Όν•œλ‹€κ³  κ°€μ •ν•˜μž.

μ € μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같은 과정을 κ±°μ³μ•Όν•œλ‹€.
1
1, 2
1, 2, 3
1, 2, 3, 4
1, 2, 3
1, 2
1, 2, 5
1, 2, 5, 6
1, 2, 5
1, 2, 5, 7
1, 2, 5, 7, 8
1, 2, 5, 7
1, 2, 5
1, 2
1

ν’€μ΄λŠ” μ½”λ“œμ˜ μ£Όμ„μœΌλ‘œ μ„€λͺ…!

int n;
stack<int> s;
queue<int> q;
vector<char> ans;

void solve()
{
	cin >> n;

	int temp;
    // queue에 λ§Œλ“€μ–΄μ•Όν•˜λŠ” μˆ˜μ—΄μ„ λ„£μ–΄μ€€λ‹€.
	for (int i = 1; i <= n; ++i)
	{
		cin >> temp;
		q.push(temp);
	}

	int pos = 1; // ν˜„μž¬ κ°€λ₯΄ν‚€λŠ” μœ„μΉ˜μ΄μž 값을 λ‚˜νƒ€λ‚Έλ‹€.
	while (!q.empty()) // μ›ν•˜λŠ” μˆ˜μ—΄μ΄ λ‚˜μ˜¬ λ•Œ κΉŒμ§€
	{
		if (!s.empty() && s.top() == q.front()) // μ›ν•˜λŠ” μˆ˜μ—΄μ˜ 뢀뢄이 λ‚˜μ˜€λŠ” 경우
		{
			s.pop();
			q.pop();
			ans.push_back('-');
		}
		else if (pos <= q.front()) // μœ„μ˜ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ μ›ν•˜λŠ” 뢀뢄이 λ‚˜μ˜¬ λ•ŒκΉŒμ§€ pushλ₯Ό ν•΄μ•Όν•œλ‹€.
		{
			while (pos <= q.front())
			{
				s.push(pos++);
				ans.push_back('+');
			}
		}
		else // μœ„μ˜ κ²½μš°κ°€ μ•ˆλœλ‹€λ©΄ λ§Œλ“€ 수 μ—†λŠ” μ‘°κ±΄μ΄λ―€λ‘œ NOλ₯Ό 좜λ ₯ν•˜κ³  끝낸닀.
		{
			cout << "NO";
			return;
		}
	}

	for (int i = 0; i < ans.size(); ++i)
		cout << ans[i] << '\n';
}

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>

using namespace std;

int n;
stack<int> s;
queue<int> q;
vector<char> ans;

void solve()
{
	cin >> n;

	int temp;
	for (int i = 1; i <= n; ++i)
	{
		cin >> temp;
		q.push(temp);
	}

	int pos = 1;
	while (!q.empty())
	{
		if (!s.empty() && s.top() == q.front())
		{
			s.pop();
			q.pop();
			ans.push_back('-');
		}
		else if (pos <= q.front())
		{
			while (pos <= q.front())
			{
				s.push(pos++);
				ans.push_back('+');
			}
		}
		else
		{
			cout << "NO";
			return;
		}
	}

	for (int i = 0; i < ans.size(); ++i)
		cout << ans[i] << '\n';
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: