본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 17298 +) 풀이

by 코딩하는 돼징 2023. 10. 17.
반응형

시간초과

문제를 보고 어 쉽네? 이렇게 풀다가 시간초과가 나왔다.

int n = int.Parse(Console.ReadLine());
string line = Console.ReadLine();
string[] token = line.Split(' ');

int[] A = new int[n]; 
StringBuilder answer = new StringBuilder();

for (int i = 0; i < n; i++)
{
    A[i] = int.Parse(token[i]); 
}
int[] NGE = new int[n];

for (int i = 0; i < n; i++)
{
    int max = -1; 
    for (int j = i + 1; j < n; j++)
    {
        if (A[i] < A[j])
        {
            max = A[j];
            break;
        }
    }
    answer.Append(max);
    if (i < n - 1)
        answer.Append(" ");
}

Console.Write(answer.ToString());

스택으로 풀어야한다!

위의 코드 같은 경우 배열 크기만큼 계속 반복되는데 스택을 사용하게되면 스택크기만큼만 반복하면 된다. 그러므로 위의 코드보다 아래 코드가 더 성능이 좋다.

 

주의

stack에 Push되는 것은 A의 원소가 아니라 i값이어야 한다. 

int n = int.Parse(Console.ReadLine());
string line = Console.ReadLine();
int[] A = Array.ConvertAll(line.Split(), int.Parse);
int[] NGE = new int[n];
Stack<int> stack = new Stack<int>();

for(int i = 0; i < n; i++)
{
    while(stack.Count > 0 && A[i] > A[stack.Peek()])
    {
        NGE[stack.Pop()] = A[i];
    }
    stack.Push(i);
}
while(stack.Count > 0)
{
    NGE[stack.Pop()] = -1;
}
Console.WriteLine(string.Join(" ", NGE));

 

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 1918 +) 풀이  (0) 2023.10.20
백준 C# - 1935 +) 풀이  (0) 2023.10.20
백준 C# - 10799 +) 풀이  (0) 2023.10.15
백준 C# - 17413 +) 풀이  (0) 2023.10.15
백준 C# - 1753 +) 풀이 단계 설명  (0) 2023.10.09

댓글