코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스 스쿨 (programmers.co.kr)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _230120_1
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
            StringBuilder sb = new StringBuilder();            

            Stack<string> stack = new Stack<string>();
            List<string> nums = new List<string>();
            for(int i = 0; i <= 10; i++) // 숫자리스트
            {
                nums.Add(i.ToString());
            }
            List<string> bonus = new List<string>(); //기호리스트
            bonus.Add("S");
            bonus.Add("D");
            bonus.Add("T");
            bonus.Add("*");
            bonus.Add("#");

            string dart = sr.ReadLine();

            for(int i = 0; i < dart.Length; i++) //스택에 입력
            {
                stack.Push(dart[i].ToString());
            }

            int option = 0;
            int cnt = 0;
            int multi = 1;
            int minus = 0;
            bool isMulti = false;
            int ten = 0;

            List<int> points = new List<int>(); //3개의 값을 저장할 리스트

            foreach(string element in stack)
            {
                
                int tmp = 0; 

                if (nums.Contains(element))
                {
                    if(element == "0") //0과 10을 구분해야 함
                    {
                        ten = 9;
                    }
                    else if (ten != 0 && element == "1")
                    {

                        tmp += ten;
                        ten = 0;
                    }
                    else
                    {
                        ten = 0;
                    }

                    tmp += int.Parse(element);

                }
                else if (bonus.Contains(element)) //입력받은 기호에 따라 옵션 저장
                {
                    if(element == "S")
                    {
                        option = 1;
                    }
                    else if (element == "D")
                    {
                        option = 2;
                    }
                    else if (element == "T")
                    {
                        option = 3;
                    }
                    else if (element == "*")
                    {
                        multi *= 2;
                        isMulti = true; //곱하기는 두번 행해진다
                    }
                    else
                    {
                        minus = -1;
                    }
                }

                if(tmp != 0)
                {
                    tmp = (int)(Math.Pow(tmp, option)); //제곱 매서드
                   
                    if (isMulti == true)
                    {
                        tmp *= multi;
                        cnt++;
                        if (cnt == 2)
                        {
                            isMulti = false;
                            cnt = 0;
                            multi = 1;
                        }
                    }
                    if (minus == -1)
                    {
                        tmp *= minus;
                        minus = 0;
                    }

                    points.Add(tmp);
                }
                
            }

            sw.WriteLine(points.Sum());

            sr.Close();
            sw.Flush();
            sw.Close();
        }
    }
}

예제의 답은 정상적으로 출력하지만 전체적으로 비효율적인 스크립트 같다.

특히 입력방식이 최악....

+ Recent posts