14일차(다항식 계산기 만들기 2)

지현·2024년 1월 4일

[다항식 계산기 만들기 2]

< replace 치환 >

  • 문자열 바꾸기
  • replace([기존문자], [바꿀문자])
 exp = exp.replaceAll("\\- ", "\\+ \\-");

< contain >

boolean needToPlus = exp.contains("+");
boolean needToMinus = exp.contains("-");
  • 문자열이 ()괄호 안의 기호 갖고 있으면 참(T)

<재귀함수>

  • run 메서드 안에서 run 메서드 실행하는 것

<두 경우의 참 확인할 때(&&)>

boolean needToMultiply = exp.contains("*");
boolean needToPlus = exp.contains("+");
boolean needToCompound = needToMultiply && needToPlus;
  • && 로 엮어서 작성

<빼기 기능 버그 수정>

  • 주의할 점
boolean needMuituply = exp.contains("*");
boolean needToPlus = exp.comtains(" + ") || exp.contains(" - ");
  • needToPlus와 needToCompound를 elseif 가 아닌 if로 엮는 이유는
    else if로 엮어놀 경우, 둘다 참인 경우에 하나의 조건 체크만 하고 if문을 빠져나가는 상황을 만들지 않기 위해서이다.
  • 마이너스(-) 쓸 때, 기호 앞뒤로 띄어쓰기 꼭 해줘야 함. 띄어쓰기 안하면, 연산부호가 아닌 음수까지 인식이 될수있기 떄문.
    ex) 10 * -10
    • -10까지 인식을 해버리면 needMultiply와 needToPlus 모두 참이 되기 때문에 오류가 남.

<불필요한 괄호 제거>

boolean needToMultiply = exp.contains(" * ");
boolean needToPlus = exp.contains(" + ") || exp.contains(" - ");
boolean needToCompound = needToMultiply && needToPlus;

 if (needToCompound) {
 if (needToPlus) {

- else if 로 엮었는데 문제가 풀리는 이유는?

문제: 10 + 5 * 2 + 5

  • 괄호 없애기 위한 조건식을 실행할 stripOuterBracket이라는 메서드 만듬
private static String stripOuterBracket(String exp) {
if (exp.charAt(0) == '(' && exp.charAt(exp.length() - 1) == ')'){
exp = exp.substring(1, exp.length() - 1);
}
return exp;
  • charAt 함수를 통해 괄호 위치를 찾고, chatAt 함수가 true 라면 괄호를 제외한 exp를 추출해내는 방식을 활용
  • charAt
    String으로 저장된 문자열 중에서 한 글자만 선택해서 char 타입으로 변환해주는 것.
  • substring
    해당 문자를 잘라내기 위해, 인덱스 위치(자르기 위한 시작 인덱스, 끝 인덱스)를 인자로 줌.
    • substring 함수는 인덱스 공간의 위치가 아닌 공간과 공간 사이에 번호를 부여함
private static String stripOuterBracket(String exp) {
  • 메서드의 꼴이 위와같은 이유는?

    1. 객체를 생성하지 않고 메서드 실행하기 때문에 static을 씀
    2. 매개변수(인자)로 string 값을 넣기 때문에 이에 맞춰서, 타입이 String 이 됨.

    <많은 괄호를 없앨때>

case 1.

   while (exp.charAt(0) == '(' && exp.charAt(exp.length() - 1) == ')'){
      exp = exp.substring(1, exp.length() - 1);
  • 양 괄호를 없애는 과정을 while문을 통해서 반복해서 모든 괄호 없애줌.
    case 2.
private static String stripOuterBracket(String exp) {
    int outerBracketCount = 0;

    while (exp.charAt(outerBracketCount) == '(' && exp.charAt(exp.length() - 1- outerBracketCount) == ')'){
      outerBracketCount++;
    }
    if(outerBracketCount == 0){
      return exp;
    }
    return exp.substring(outerBracketCount,exp.length() - outerBracketCount);
  }
  • outerBracketCount 라는 변수를 만들고, while 반복문 chatAt 함수의 인덱스 숫자로 outerBracketCount를 넣은 후 while 문이 true 일 때, outerBracketCount 인자를 1씩 증가시킴.
    그 후, substring으로 exp의 괄호를 잘라낼 때, outerBracketCount가 증가한만큼을 인덱스 숫자로 잘라주면 괄호가 다 잘려나감.
    • return 값에서 case1과 다르게 length() - 1 - outerBracketCount 사이의 1을 뺀 이유는?
exp.substring(outerBracketCount,exp.length() - outerBracketCount
  • 1을 더 뺴버리면 괄호만 잘리는게 아니고 그 앞의 것까지 하나가 더 잘려나감. 왜냐면 인덱스 번호는 원래 length보다 하나가 더 적기 때문.
if (outerBracketCount == 0){
return exp;
}
  • "exp 변수에 괄호가 하나도 없다면 exp 그대로 return 해라" 의 의미.
exp = exp.trim();
exp = stripOuterBracket(exp);
if ((!exp.contains(" ")) return Integer.parseInt(exp);
  • 공백을 포함한다는 것은, 연산부호가 포함되어있다는 의미이니까 공백을 포함하지 않는 경우가 T라면, exp를 정수화한 값을 return 하면 (100) == 100 과 같은 값을 추출할 수 있음.

<(10 + 20)*3>

String secondExp = exp.substring(splitPointIndex + 3);

      char operator = exp.charAt(splitPointIndex + 2);

      exp = Calc.run(firstExp) + " " + operator + " " + Calc.run(secondExp);

      return Calc.run(exp);
profile
자바는 내 아가 ♡

0개의 댓글