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

Yullc·2025년 3월 19일
post-thumbnail

1. 10 x 10 x 10

나는 이 방법을 어떻게 해결 했냐!
일단 10x10x10만 되게 하자.. 라는 생각으로 그냥 이것만 되라~ 라는 생각으로 풀어보았어

  • 처음으로 생각한건 if와 else로 조건을 붙이자 라고 생각했는데, 문자열안에 *가 들어가있으면 if문을 실행하고 아니면 else로 실행하도록 설계를 해봤어
  • 먼저 숫자 3개니까 *로 자르고 일단 배열에다가 자른 값들을 넣어줬어. 그런 다음 배열 안 에 있는 값들을 곱해줬다고 생각하면 돼
  • -가 나오면 + - 로 바꾸고 +로 자른 값을 배열에 담아줬어 그리고 값을 더해주면 내가 원하는 값이 나오게 되었어.

이 문제는 뭔가 정답은 맞췄는데 억지로 맞추는 느낌이야..

 public static int run(String exp) {
        if(exp.contains("*")) {
            String[] bits = exp.split(" \\* ");

            System.out.println(bits.length);
            System.out.println(bits[0] + "*" + bits[1] + "*" + bits[2]);

            int a = Integer.parseInt(bits[0]);

            int b = Integer.parseInt(bits[1]);
            int c = Integer.parseInt(bits[2]);
            System.out.println(a + "*" + b + "*" + c);
            return a * b * c;
        }
        else{
            exp = exp.replace("- ", "+ -");
            String[] bits = exp.split(" \\+ ");

            int a = Integer.parseInt(bits[0]);
            System.out.println(bits[0]);
            int b = Integer.parseInt(bits[1]);
            int c = 0;

            if (bits.length > 2) {
                c = Integer.parseInt(bits[2]);
            }
            return a + b + c;
        }
    }

내꺼가 마음에 안들어서 강사님이 하신 풀이법 알려줄게

package org.example;
public class Calc {
    public static int run(String exp) {

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

        if (needToPlus) {
            exp = exp.replace("- ", "+ -");

            String[] bits = exp.split(" \\+ ");
            int sum = 0;
            for (int i = 0; i < bits.length; i++) {
                sum += Integer.parseInt(bits[i]);
            }
            return sum;
        } else if (needToMulti) {
            String[] bits = exp.split(" \\* ");
            int sum = 1;

            for (int i = 0; i < bits.length; i++) {
                sum *= Integer.parseInt(bits[i]);
            }
            return sum;
        }
         throw new RuntimeException("해석 불가 : 올바른 계산식이 아닙니다");
    }
}

강사님은 반복문을 돌면서 자동으로 연산이 되도록 수행하셨어! 확실히 반복해서 하는게 좀 더 깔끔하고 좋은 코드가 맞는것 같아 하지만 여기서의 문제점은 +로 구성된 연산들은 되지만 저번에 했던 -가 포함된 연산은 오류가 날거야.. 원래 내가 풀이 했던거를 좀 추가해서 살짝 수정해줬어

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("- ", "+ -");
       }
       String[] bits = exp.split(" \\+ ");
       int sum = 0;
       for (int i = 0; i < bits.length; i++) {
           sum += Integer.parseInt(bits[i]);
       }
       return sum;
   }

이렇게 if문안에를 *가 포함되었을때로 바꾸고 else로 둬서 나머지를 수행하도록 만들었어.

2. 10 + 5 * 2

이번에는 세자리 숫자를 더하거나 곱하거나 이거야!

그래서 내가 생각한거는

  • 지금 까지 +로 split했으니까 똑같이 +로 나눠서 계산하는거야.
  • 이 경우는 +와 *연산자가 동시에 있으니까 이것도 bool값을 정해줘서 조건문으로 판별하는거지
  • +와 *가 동시에 있으면 +로 나눠서 인덱스에 있는 값들을 더해서 출력하면돼!
public class Calc {
    public static int run(String exp) {
        boolean needToMulti = exp.contains("*");
        boolean needToPlus = exp.contains("+");
        boolean needToCompound = needToPlus && needToMulti;

        if (needToCompound) {
            String[] bits = exp.split(" \\+ ");
            return Integer.parseInt(bits[0]) + run(bits[1]);
        }
        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("- ", "+ -");

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

            int sum = 0;

            for (int i = 0; i < bits.length; i++) {
                sum += Integer.parseInt(bits[i]);
            }

            return sum;
        }
    }
}

이렇게 이건 천천히 생각해보니까 어려운 문제는 아니었어

20 + 10 + 5 * 2

이번 문제는 생각보다 너무 어려웠는데 강사님이 힌트를 주신 덕분에 다행히 내가 원하는 풀이로 해결 할 수 있었어.

  • 나는 처음 생각한게 *를 풀어서 설명하면 더하기 잖아? 그래서 20 + 10 + 5 + 5 +5 이렇게 할까 했는데 코드로 어떻게 짜야할지 모르겠는거야.. 그래서 다음 방법을 생각했어.
  • 두번째 방법은 마찬가지로 +로 짜르는데 그럼 20, 10, 5 , 5 2 이렇게 짤리잖아?
    그러면 인덱스안에
    가 있는지 없는지 contain함수를 사용해서 확인하는거야!!
  • 그리고 값이 있으면 run메서드를 다시 수행하면 5*2만 인덱스에 있으니까곱하기 연산만 수행이 될꺼아니야! 그 값을 a에 넣고 sum에다가 더해줘
  • 그리고 else로 넘어가서 차례대로 정수형으로 바꿔준다음 sum에다 넣으면 10 + 20 +10 해서 40이지?
  • 마지막으로 sum을 return하면 끝!
import java.util.Arrays;
public class Calc {
   public static int run(String exp) {
       boolean needToMulti = exp.contains("*");
       boolean needToPlus = 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("- ", "+ -");
       }
       String[] bits = exp.split(" \\+ ");
       int sum = 0;
       for (int i = 0; i < bits.length; i++) {
           sum += Integer.parseInt(bits[i]);
       }
       return sum;
   }
}
profile
아자아자자

0개의 댓글