πŸ™‡β€β™€οΈ[Gold V] 탑 - 2493

문제 링크

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

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

λΆ„λ₯˜

자료 ꡬ쑰, μŠ€νƒ

제좜 일자

2024λ…„ 2μ›” 6일 15:33:46

문제 μ„€λͺ…

KOI ν†΅μ‹ μ—°κ΅¬μ†ŒλŠ” λ ˆμ΄μ €λ₯Ό μ΄μš©ν•œ μƒˆλ‘œμš΄ λΉ„λ°€ 톡신 μ‹œμŠ€ν…œ κ°œλ°œμ„ μœ„ν•œ μ‹€ν—˜μ„ ν•˜κ³  μžˆλ‹€. μ‹€ν—˜μ„ μœ„ν•˜μ—¬ 일직선 μœ„μ— N개의 높이가 μ„œλ‘œ λ‹€λ₯Έ 탑을 μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½ λ°©ν–₯으둜 μ°¨λ‘€λ‘œ μ„Έμš°κ³ , 각 νƒ‘μ˜ κΌ­λŒ€κΈ°μ— λ ˆμ΄μ € 솑신기λ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. λͺ¨λ“  νƒ‘μ˜ λ ˆμ΄μ € μ†‘μ‹ κΈ°λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ§€ν‘œλ©΄κ³Ό ν‰ν–‰ν•˜κ²Œ μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½ λ°©ν–₯으둜 λ°œμ‚¬ν•˜κ³ , νƒ‘μ˜ κΈ°λ‘₯ λͺ¨λ‘μ—λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” μž₯μΉ˜κ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€. ν•˜λ‚˜μ˜ νƒ‘μ—μ„œ λ°œμ‚¬λœ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” 단 ν•˜λ‚˜μ˜ νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ μ΄ κ°€λŠ₯ν•˜λ‹€.

예λ₯Ό λ“€μ–΄ 높이가 6, 9, 5, 7, 4인 λ‹€μ„― 개의 탑이 μˆ˜ν‰ 직선에 일렬둜 μ„œ 있고, λͺ¨λ“  νƒ‘μ—μ„œλŠ” 주어진 탑 μˆœμ„œμ˜ λ°˜λŒ€ λ°©ν–₯(μ™Όμͺ½ λ°©ν–₯)으둜 λ™μ‹œμ— λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό λ°œμ‚¬ν•œλ‹€κ³  ν•˜μž. 그러면, 높이가 4인 λ‹€μ„― 번째 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” 높이가 7인 λ„€ 번째 탑이 μˆ˜μ‹ μ„ ν•˜κ³ , 높이가 7인 λ„€ 번째 νƒ‘μ˜ μ‹ ν˜ΈλŠ” 높이가 9인 두 번째 탑이, 높이가 5인 μ„Έ 번째 νƒ‘μ˜ μ‹ ν˜Έλ„ 높이가 9인 두 번째 탑이 μˆ˜μ‹ μ„ ν•œλ‹€. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 λ ˆμ΄μ € μ‹ ν˜ΈλŠ” μ–΄λ–€ νƒ‘μ—μ„œλ„ μˆ˜μ‹ μ„ ν•˜μ§€ λͺ»ν•œλ‹€.

νƒ‘λ“€μ˜ 개수 Nκ³Ό νƒ‘λ“€μ˜ 높이가 μ£Όμ–΄μ§ˆ λ•Œ, 각각의 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ–΄λŠ νƒ‘μ—μ„œ μˆ˜μ‹ ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫째 쀄에 νƒ‘μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N이 주어진닀. N은 1 이상 500,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” N개의 νƒ‘λ“€μ˜ 높이가 직선상에 놓인 μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 주어진닀. νƒ‘λ“€μ˜ λ†’μ΄λŠ” 1 이상 100,000,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 주어진 νƒ‘λ“€μ˜ μˆœμ„œλŒ€λ‘œ 각각의 νƒ‘λ“€μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•œ νƒ‘λ“€μ˜ 번호λ₯Ό ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” 탑이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

stack을 μ΄μš©ν•œ λ¬Έμ œμ΄λ‹€.

void solve()
{
	int n;
	stack<pair<int, int>> s;

	cin >> n;

	for (int i = 0; i < n; ++i)
	{
		int height;
		cin >> height;

		while (s.empty() == false)
		{
			if (height < s.top().second)
			{
				cout << s.top().first << " ";
				break;
			}

			s.pop();
		}

		if (s.empty())
			cout << 0 << " ";

		s.push({ i + 1, height });
	}
}

값을 μž…λ ₯받을 λ•Œ μŠ€νƒμ„ μ²΄ν¬ν•œλ‹€.
μŠ€νƒμ„ 체크할 λ–„ s.empty() == false 라면 0 을 좜λ ₯ν•œλ‹€.

μŠ€νƒμ΄ 있으면 μž…λ ₯받은 νƒ‘μ˜ 높이와 μŠ€νƒμ˜ top 의 높이와 λΉ„κ΅ν•œλ‹€.
μŠ€νƒμ΄ 더 μž‘μœΌλ©΄ pop을 ν•œλ‹€.

μ•„λ‹ˆλ©΄ μŠ€νƒμ˜ νƒ‘μ˜ 인덱슀λ₯Ό 좜λ ₯ν•œλ‹€.
μ΄κ²½μš°μ—λŠ” μŠ€νƒμ΄ λ‚¨μ•„μžˆλŠ” κ²½μš°μ΄λ‹€.

그러고 μž…λ ₯받은 νƒ‘μ˜ μΈλ±μŠ€μ™€ νƒ‘μ˜ 높이λ₯Ό μŠ€νƒμ— ν‘Έμ‰¬ν•œλ‹€.

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

#define _CRT_SECURE_NO_WARNINGS

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

using namespace std;

void solve()
{
	int n;
	stack<pair<int, int>> s;

	cin >> n;

	for (int i = 0; i < n; ++i)
	{
		int height;
		cin >> height;

		while (s.empty() == false)
		{
			if (height < s.top().second)
			{
				cout << s.top().first << " ";
				break;
			}

			s.pop();
		}

		if (s.empty())
			cout << 0 << " ";

		s.push({ i + 1, height });
	}
}

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

	solve();

	return 0;
}

νƒœκ·Έ:

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

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