문제 풀이/C#
[17298] - 오큰수
Chamber
2022. 10. 6. 09:36
https://www.acmicpc.net/problem/17298
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
접근 방식
2중 반복문으로 현재가 i라면 i+1부터 끝까지 돌리면서 현재보다 큰 값이 나오면 그 값stringbuilder에 넣고 탈출, 큰 값이 없으면 -1 넣어주었는데 38%에서 시간초과가 떴다.
그래서 어차피 수의 크기는 의미가 없고 현재보다 우측이 크면 되니 가장 우측부터 돌려서 하나하나 비교하기로 했다.
- stb.insert를 사용했다가 시간초과가 떠서 배열로 바꿔 줌.
문제 풀이
1. 가장 우측부터 돌린다. 가장 우측은 스택도 비어있고, 오른쪽에 자신보다 큰게 없으니 -1, 스택에 삽입
2. 만약 스택이 차있고 꼭대기가 현재값 보다 크면 탈출, 작으면 빼기 -> 스택의 꼭대기는 오른쪽 가장 왼쪽 값이니 일단 현재값보다 크면 그냥 그거 출력해주면 된다.
- ex) 현재가 3, 스택에 2, 7이 들어있으면 2는 빠지고 7이 남기 때문
3. 스택에 현재값 넣고 반복
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _17298
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
Stack<int> stack = new Stack<int>();
int[] ans = new int[n];
for(int i = n-1; i>=0; i--)
{
//스택에 들어있으면
while (stack.Count > 0)
{
//만약 스택 top이 지금보다 같거나 작으면 뽑기
if (stack.Peek() <= arr[i])
stack.Pop();
else //아니면 탈출
break;
}
//스택이 비었다면 현재보다 우측에 큰게 없으니까 -1
if (stack.Count == 0)
ans[i] = -1;
else //아니면 가장 우측 왼쪽꺼가 꼭대기에 있음
ans[i] = stack.Peek();
stack.Push(arr[i]);
}
Console.WriteLine(string.Join(" ", ans));
}
}
}