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

+ Recent posts