본문 바로가기
개발/문제풀이

문제풀이)프로그래머스)c#)계산기

by 테샤르 2021. 2. 1.

계산기

사칙연산 계산을 하는 문제이다.

 

출력 예시는 다음과 같다.

 

입력 : 2 +3 = 출력 :5

입력 : 5*3*2 = 출력 : 30

입력 : 8/2-4*5 = 출력 : -16

 

사칙연산의 우선순위에 대한 로직이 포함되어있어야 한다. ( 곱하기 / 나누기 )

반응형

 

 

우리가 일반적으로 쓰는 중위 표기법 ( 연산기호가 숫자의 중간)을 후위 표기법으로 진행해서 처리한다.( 연산기호가 숫자의 마지막)

 

후위 표기법으로 위의 출력 예시를 변경하면 다음과 같다.

변경 : 2 3 +

변경 : 5 3 * 2*

변경 : 8 2 / 4 5 * -

원본의 중위표현을 사칙연산의 우선순위에 따라 괄호로 표현하고 후위 표현 이후에 계산하는 방식으로 작업을 진행했다.

 

<괄호 표현 로직>

private string changeBracket(string _value){
       
        char[] token = _value.ToCharArray();
        StringBuilder sb = new StringBuilder();
        string returnValue = string.Empty;
        Stack stack = new Stack();
        Dictionary<char,int> prec = new Dictionary<char, int>();
        prec.Add('*',3);
        prec.Add('/',3);
        bool flag = false;

        for(int i = 0; i <token.Length ; i++){

            char c = token[i];
            sb.Append(c);
            if(prec.ContainsKey(c) == false){
                if(flag == true){
                    returnValue = string.Format("({0})",sb.ToString());
                    sb.Clear();
                    sb.Append(returnValue);
                }
                flag = false;
            }
            else{
               flag = true;
            }
        }

        returnValue =sb.ToString();

        return returnValue;
    }

<후위 연산자 변경 로직>

private ArrayList infixToPostfix(string _value){

        char[] token = _value.ToCharArray();
        Stack opStack = new Stack();
        ArrayList result = new ArrayList();
        Dictionary<char,int> prec = new Dictionary<char, int>();
        prec.Add('*',3);
        prec.Add('/',3);
        prec.Add('+',2);
        prec.Add('-',2);
        prec.Add('(',1);


        for(int i =0;i< token.Length;i++){
            char c = token[i];
            if(c.Equals('(')){
                opStack.Push(c);
            }
            else if(c.Equals(')')){
                while(!opStack.Peek().Equals('(')){
                    var val = opStack.Pop();
                    if(val.Equals('(') == false){
                        result.Add(val);
                    }
                }
                opStack.Pop();
            }
            else if(prec.ContainsKey(c) == true){
                if(opStack.Count == 0){
                    opStack.Push(c);
                }
                else{
                    var top = opStack.Peek();
                    prec.TryGetValue(c, out int currentPriority);
                    prec.TryGetValue((char)top, out int topPriority);
                    if(topPriority >= currentPriority){
                        result.Add(opStack.Pop());
                        
                    }
                    opStack.Push(c);
                }
            }
            else{
                result.Add(c);
            }
        }

        while(opStack.Count > 0){
            result.Add(opStack.Pop());
        }

        return result;
    }
반응형

 

<계산 로직>

private int calculator(ArrayList _list){
        int returnValue = 0;
        Stack stack = new Stack();
        Dictionary<char,int> prec = new Dictionary<char, int>();
        prec.Add('*',3);
        prec.Add('/',3);
        prec.Add('+',2);
        prec.Add('-',2);
        prec.Add('(',1);

        for(int i = 0; i< _list.Count;i++){
            char item = (char)_list[i];
            if(prec.ContainsKey(item) == true){
                //계산식

                int two = (int) stack.Pop();
                int one = (int) stack.Pop();
                
                int result = 0;
                if(item.Equals('+')){
                    result = (one + two);
                }
                else if(item.Equals('-')){
                    result = (one - two);
                }
                else if(item.Equals('*')){
                    result = (one * two);
                }
                else if(item.Equals('/')){
                    result = (one / two);
                }

                stack.Push(result);
            }
            else{
                int value = (int)Char.GetNumericValue(item);
                stack.Push(value);
            }
        }

        returnValue = (int)stack.Pop();

        return returnValue;
    }

여러가지 케이스를 대응해야 하는 문제로 조금 시간을 많이 걸리긴 했다. 기본적으로 컴퓨터의 연산 원리이다.

 

 

 ★

 

반응형

댓글