[BOJ][C#] 5430 AC

LimJaeJun·2024년 1월 6일
1

PS/BOJ

목록 보기
87/108

📕 문제

📌 링크

📗 접근 방식

문자열 파싱:

  • 주어진 문자열 s, 리스트의 길이 n, 리스트의 원소 문자열 temp를 파싱하여 리스트 list를 생성한다.

연산 수행을 위한 변수 초기화:

  • reverse: 현재 리스트 순회 방향 (정방향 또는 역방향)
  • flag: 연산 수행 중 에러가 발생하면 false로 설정하여 나중에 처리
  • dequeCount: 현재까지 수행한 D 연산의 횟수
  • start, end: 리스트 순회를 위한 시작과 끝 포인터

주어진 연산 수행:

  • 문자열 s를 순회하며 R 연산일 경우 순회 방향을 반전시키고, D 연산일 경우 포인터를 이동시킨다.

결과 출력:

  • 연산 수행이 끝난 후, 에러가 없으면 리스트를 출력한다.
  • 출력 시, 현재 방향에 따라 순회하며 결과 문자열을 생성한다. 결과 문자열의 마지막에는 개행을 추가한다.
  • 에러가 있을 경우 "error"를 출력한다.

📘 코드

using System.Text;

namespace BOJ
{
    class No_5430
    {        
        static void Main()
        {
            StringBuilder sb = new StringBuilder();
            int testCase = InputToInt();

            while (testCase-- > 0)
            {
                bool reverse = false;
                
                bool flag = true;
                string s = Input();
                int n = InputToInt();
                string temp = Input();
                temp = temp.Substring(1, temp.Length - 2);
                var list = n == 0 ? new List<int>() : Array.ConvertAll(temp.Split(','), int.Parse).ToList();

                int dequeCount = 0;
                int start = 0;
                int end = list.Count - 1;

                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] == 'R')
                    {
                        reverse = !reverse;
                    }
                    else
                    {
                        dequeCount++;
                        
                        if (dequeCount > list.Count)
                        {
                            flag = false;
                            
                            break;
                        }

                        if (reverse == true)
                        {
                            end--;
                        }
                        else
                        {
                            start++;
                        }
                    }
                }

                if (flag == true)
                {
                    sb.Append('[');
                    if (reverse == true)
                    {
                        for (int i = end; i >= start; i--)
                        {
                            if (i == start)
                            {
                                sb.Append($"{list[i]}");   
                            }
                            else
                            {
                                sb.Append($"{list[i]},");    
                            }
                        }
                    }
                    else
                    {
                        for (int i = start; i <= end; i++)
                        {
                            if (i == end)
                            {
                                sb.Append($"{list[i]}");   
                            }
                            else
                            {
                                sb.Append($"{list[i]},");    
                            }
                        }
                    }
                    sb.Append(']');
                    sb.AppendLine();
                }
                else
                {
                    sb.AppendLine("error");
                }
            }

            Console.Write(sb);
        }
        
        static int InputToInt() => int.Parse(Console.ReadLine());
        static string Input() => Console.ReadLine();
    }
}

📙 오답노트

처음에는 Reverse와 Remove를 모두 List의 내장함수를 사용하였다. => 시간초과
Reverse를 flag(bool)로 판단하여 앞에서 출력 혹은 뒤에서 출력으로 수정하였다 => 대략 2000ms
Remove를 index(int)로 판단하여 출력 시작과 끝을 결정하도록 수정하였다. => 대략 244ms

📒 알고리즘 분류

  • 구현
  • 자료 구조
  • 문자열
  • 파싱
profile
Dreams Come True

0개의 댓글

관련 채용 정보