[C#]백준 2493번: 탑
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
- 문제
- 문제풀이
탑의 번호를 나타내는 스택과 탑의 높이를 나타내는 스택을 생성해준다.
그후 첫번째 입력받았던 탑의 개수인 N번만큼 반복문을 만들어준다.
탑의 번호를 나타내야해서 1부터 N까지 반복문을 만들었다.
첫번째는 6이다.
스택에는 아무것도 없으니 출력에 "0"을 쌓아주고 스택에 넣어준다.
출력: 0
num스택 :1
towerlevel 스택:6
두번째는 9인데 6과 비교했을때 9가 더 크기때문에 이전의 스택들을 Pop해준다. 이후 (2,9)를 Push해주었다.
출력: 0 0
num스택 :2
towerlevel 스택:9
세번째는 5이다. 9와 비교했을 때 9가 더 크기때문에 9의 순서인 2를 출력해주고 (3,5)를 Push한다.
출력: 0 0 2
num스택 :2 3
towerlevel 스택9 5
네번째는 7이다. 7은 5와 비교했을 때 5가 더 작기때문에 스택을 Pop해주고 2를 출력해준다. 이후 (4,7)을 스택에 넣어준다.
출력: 0 0 2 2
num스택 :2 4
towerlevel 스택:9 7
마지막은 4이다. 7과 비교했을 때 7이 더 크기때문에 7의 순서인 4를 출력해주고 (5,4)를 Push해준다.
출력: 0 0 2 2 4
num스택 :2 4 5
towerlevel 스택:9 7 4
- 코드 1
using System.Text;
namespace YongYong2
{
internal class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
Stack<int> towerlevel = new Stack<int>();
Stack<int> num= new Stack<int>();
int N = int.Parse(Console.ReadLine());
int Top = 0;
string[] input=Console.ReadLine().Split();
for(int i=1; i<=N; i++)
{
Top = int.Parse(input[i-1]);
while (towerlevel.Any())//스택에 숫자가 있다면 탑의 높이 출력
{
if (towerlevel.Peek() > Top)
{
sb.Append(num.Peek()+" ");
break;
}
towerlevel.Pop();
num.Pop();
}
if (!towerlevel.Any())//스택에 숫자가 없다면 0출력
{
sb.Append("0 ");
}
towerlevel.Push(Top);
num.Push(i);
}
Console.WriteLine(sb.ToString());
}
}
}
- 후기
그림판 꿀잼