TDD를 활용한 계산기 만들기 3

Yullc·2025년 3월 19일
post-thumbnail

1. (10+20) == 30, ((10+20)) == 30, (((10+20))) == 30

package org.example;

import java.util.Arrays;

public class Calc {

    public static int run(String exp) {

        boolean needToMulti = exp.contains("*");
        boolean needToPlus = exp.contains("+");
        boolean needTole = exp.contains("(");
      

        boolean needToCompound = needToPlus && needToMulti;

        if (needToCompound) {
            int a;
            int b;
            int sum = 0;
            String[] bits = exp.split(" \\+ ");
            for (int i = 0; i < bits.length; i++) {
                if (bits[i].contains("*")) {
                    a = run(bits[i]);
                    System.out.println("a=" + a);
                    sum += a;
                } else {
                    b = Integer.parseInt(bits[i]);
                    System.out.println("b=" + b);
                    sum += b;
                }
                System.out.println("sum=" + sum);
            }
            return sum;
        }
        if (needToMulti) {

            String[] bits = exp.split(" \\* ");

            int sum = 1;

            for (int i = 0; i < bits.length; i++) {
                sum *= Integer.parseInt(bits[i]);
            }
            return sum;
        } else {
            exp = exp.replace("- ", "+ -");
            if (needTole) {
                exp = exp.replace("(", "");
                exp = exp.replace(")", "");

                String[] bits = exp.split(" \\+ ");
                int sum = 0;
                for (int i = 0; i < bits.length; i++) {
                    sum += Integer.parseInt(bits[i]);
                    System.out.println("sum=" + sum);
                }
                return sum;
            }
            else {
            String[] bits = exp.split(" \\+ ");
            int sum = 0;
            for (int i = 0; i < bits.length; i++) {
                sum += Integer.parseInt(bits[i]);
            }
            return sum;
            }
        }
    }
}

이 문제의 풀이 방법의 핵심은 replace를 얼마나 활용하는가. 나는 이렇게 생각했어. 나는 또 뒤에 생각은 안하고 이 문제만 해결해야한다는 생각으로 풀었어.

  • 먼저 경우의 수를 또 생각해서 exp문자열안에 '('가 있는경우를 또 만들었어 그런다음에 replace로 공백을 제거해
  • +로 split해서 배열에 넣은다음 for문을 이용해 배열을 돌면서 더한값을 sum에 넣어. 음.. 그러면 될거야.
  • 그래서 단순이 소괄호가 몇개가 있던 제거를 해서 연산을 하는거야 하지만 + 말고 다른 연산자가 있으면 다른 방법을 생각해 봐야할것같아.
  • 점점 이 과제를 해결하면서 물론 어렵지만 효율성없고 안좋은코드로 내가 짜는게 느껴진다.. 근데 이거 말고는 방법을 아직 모르겠어 흑흑

2. (10 + 20) * 3 =90

이거는 말이지.. 괄호와 *를 같이 있는 경우를 추가했어.
밑에를 보면 알겠지만 needToCompound&&needTole 이 부분이 왜 if조건에 있냐면 이 조건이 거짓일때 else if로 넘어가게 하려고 일부러 맨 처음으로 놨어.

if (needToCompound&&needTole) {
            int a;
            int b = 0;

            exp = exp.replace("(", "");
            exp = exp.replace(")", "");
            String[] bits = exp.split(" \\* ");
            for (int i = 0; i < bits.length; i++) {

                if (bits[i].contains("+")) {
                    String[] arr = bits[i].split(" \\+ ");
                    for (int j = 0; j < arr.length; j++) {

                        b += Integer.parseInt(arr[j]);

                    }

                } else {
                    a = run(bits[i]);
                    System.out.println("a=" + a);
                    b *= a;
                }
                
            }
            return b;
        }

이렇게만 추가해줬는데

  • 나는 먼저 소괄호들을 제거 하고 시작했어.그럼 10+20*3이 되겠지
  • 그리고 * 로 나눴는데 그러면 10+20/ 3이 나올거잖아? 그러면 먼저 10+20을 계산하도록 내가 만드는거야.
  • 그래서 for문을 돌아 bits의 길이만큼 그리고 만약 bits[i]에 +가 포함되어있다면 String arr[] 배열을 만들어 거기에 +로 나눈 값들을 넣는거지 그럼 10,20이 나눠서 들어갈거야.
  • 그럼 Integer.pareInt해가지고 정수로 변환해서 b에다가 더한 값을 저장해
  • 그리고 +가 포함되어있지않다! 이러면 run(bits[i])를 해서 a에 값을 넣자.
  • 그 다음에 아까 저장한 b의 값이랑 a랑 더해서 다시 b에 넣고 b를 return하면 끝!@!
profile
아자아자자

0개의 댓글