https://www.acmicpc.net/problem/5397
5397번: 키로거
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입
www.acmicpc.net
접근 방법
스택 하나와 리스트로 풀려 했지만 insert를 쓰면 시간초과가 날거 같아서 스택 2개로 변경
문제 풀이
- pw 스택은 비밀번호를 저장할 스택, move는 <,>가 나오면 pw에서 잠시 이동시킬 스택
- <가 나오면 이전으로 이동해야되니 pw에서 move로 이동
- >가 나오면 뒤로 가야되니 move에서 pw로 이동
- - 가 나오면 pw에서 하나 삭제
- 나머지 문자들은 pw에 넣기
- 화살표가 문자 끝이 아닌 중간에서 끝날 수 있으니 move의 남은 문자들을 pw로 하나씩 이동
- pw에 있는 문자들은 역순으로 되어있으니 list에 넣고 뒤집어주기
- 뒤집은 리스트 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.silver
{
class _5397
{
static void Main(String[] args)
{
StringBuilder stb = new StringBuilder();
int test = int.Parse(Console.ReadLine());
for(int t = 0; t< test; t++)
{
string s = Console.ReadLine();
//비밀번호 저장용
Stack<char> pw = new Stack<char>();
//화살표 나올 때 쓸 스택
Stack<char> move = new Stack<char>();
for(int i = 0; i<s.Length; i++)
{
char c = s[i];
// < 나오면 비밀번호 스택에서 move스택으로 이동
if (c == '<')
{
if (pw.Count > 0)
move.Push(pw.Pop());
}
// > 나오면 move에서 pw로 이동
else if (c == '>')
{
if (move.Count > 0)
pw.Push(move.Pop());
}
// - 나오면 pw에서 하나 제거
else if(c == '-')
{
if (pw.Count > 0)
pw.Pop();
}
//문자 스택에 넣기
else
pw.Push(c);
}
List<char> keylog = new List<char>();
//move에 남아있는 문자들 pw로 이동
while (move.Count > 0)
pw.Push(move.Pop());
//리스트에 넣고 뒤집기 - 거꾸로 넣어져 있음
while (pw.Count > 0)
keylog.Add(pw.Pop());
keylog.Reverse();
stb.AppendLine(string.Join("",keylog));
}
Console.WriteLine(stb);
}
}
}
'문제 풀이 > C#' 카테고리의 다른 글
[11286] - 절댓값 힙 (0) | 2022.11.09 |
---|---|
[1074] - Z (0) | 2022.11.08 |
[2110] - 공유기 설치 (0) | 2022.11.06 |
[1644] - 소수의 연속합 (0) | 2022.11.04 |
[15922] - 아우으 우아으이야!! (0) | 2022.11.04 |