계산기
사칙연산 계산을 하는 문제이다.
출력 예시는 다음과 같다.
입력 : 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;
}
여러가지 케이스를 대응해야 하는 문제로 조금 시간을 많이 걸리긴 했다. 기본적으로 컴퓨터의 연산 원리이다.
★★★★☆
반응형
'개발 > 문제풀이' 카테고리의 다른 글
문제풀이)프로그래머스)2022 KAKAO BLIND RECRUITMENT -신고 결과 받기 (0) | 2022.07.19 |
---|---|
문제풀이)프로그래머스)c#) 삼각 달팽이 (1) | 2021.02.13 |
문제풀이)프로그래머스)c#) 여행경로 (0) | 2020.12.23 |
문제풀이)프로그래머스)c#) 가장 큰 수 (0) | 2020.09.07 |
문제풀이)프로그래머스)c#) 단어퍼즐 (0) | 2020.08.31 |
댓글