https://www.acmicpc.net/problem/9935
9935번: 문자열 폭발
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모
www.acmicpc.net
C# 출력이 느린걸 너무 간과했다..
틀린 이유
1. 메모리 초과, 틀렸습니다 -> 문제를 잘못 읽고 폭탄문자열에 해당하는 문자가 있으면 해당 문자 삭제 ex) C4 면 C와 4 삭제
2. 시간초과 -> 겨우 stringbuilder 사용안해서 틀림..
접근 방식
- 스택은 먼저 들어온것이 늦게 나오므로 문자열을 뒤에서 부터 넣어주면 pop할 때 정순으로 나와서 뒤부터 시작.
- 뒤에부터 시작했으니 폭탄의 앞글자가 나오면 폭탄의 길이만큼 비교, 폭탄이면 그대로 빼고 아니면 다시 뒤부터 넣어줌
- 출력
- 시간초과 때문에 string에서 list, char[]로 자료형도 바꿔보고, 폭탄의 글자 전부를 뺀 후 비교해서 구현도 해보았지만, 결국 입출력이 느린 C#에서 stringbuilder를 안써서 계속 틀린문제..
list 사용해서 폭탄인지 하나하나 구별한 것
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _9935
{
static void Main(string[] args)
{
StringBuilder stb = new StringBuilder();
string str = Console.ReadLine();
string bomb = Console.ReadLine(); //폭탄 문자열
Stack<char> stack = new Stack<char>();
//스택은 선입후출이니 뒤에서부터 해줌
for(int i = str.Length-1; i>=0; i--)
{
stack.Push(str[i]);
//스택의 크기가 폭탄 이상이고
if (stack.Count >= bomb.Length)
{
//가장최근에 들어온게 폭탄의 앞글자면
if(stack.Peek() == bomb[0])
{
//폭탄인지 구별하기
bool isbomb = true;
List<char> check = new List<char>();
for(int j = 0; j<bomb.Length; j++)
{
check.Add(stack.Pop());
if (check[j] != bomb[j])
{
isbomb = false;
break;
}
}
if (!isbomb)
{
for(int j = check.Count-1; j>=0; j--)
stack.Push(check[j]);
}
}
}
}
if (stack.Count > 0)
while (stack.Count > 0)
stb.Append(stack.Pop());
else
stb.AppendLine("FRULA");
Console.WriteLine(stb);
}
}
}
폭탄길이만큼 출력 후 한번에 비교한 것
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _9935
{
static void Main(string[] args)
{
StringBuilder stb = new StringBuilder();
string str = Console.ReadLine();
string bomb = Console.ReadLine(); //폭탄 문자열
Stack<char> stack = new Stack<char>();
for(int i = str.Length-1; i>=0; i--)
{
stack.Push(str[i]);
if (stack.Count >= bomb.Length)
{
if(stack.Peek() == bomb[0])
{
string check = "";
for (int j = 0; j < bomb.Length; j++)
check += stack.Pop();
if (check != bomb)
{
for(int j = check.Length-1; j>=0; j--)
stack.Push(check[j]);
}
}
}
}
if (stack.Count > 0)
while (stack.Count > 0)
stb.Append(stack.Pop());
else
stb.AppendLine("FRULA");
Console.WriteLine(stb);
}
}
}
'문제 풀이 > C#' 카테고리의 다른 글
[9639] - Omar Loves Candies (0) | 2022.10.07 |
---|---|
[17298] - 오큰수 (0) | 2022.10.06 |
[10026] - 적록색약 (0) | 2022.10.05 |
[16928] - 뱀과 사다리 게임 (0) | 2022.10.05 |
[1012] - 유기농 배추 (0) | 2022.10.03 |