관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.다항식 더하기 본문

코딩테스트/자바

[프로그래머스] Lv0.다항식 더하기

100세까지 코딩 2023. 8. 14. 17:06
문제 설명

 

풀기 전 생각
  • 항과 연산기호 사이에 항상 공백이 존재하고 + 기호만 사용하니 " + "로 string을 split 하기
  • split 한 string 배열 중 x를 포함하면 x끼리 더하고 x를 포함하지 않으면 상수항끼리 더하기
class Solution {
    public String solution(String polynomial) {
        String answer = "";
        int xSum = 0;  // x값들의 합을 저장할 변수
        int sum = 0;   // 상수항들의 합을 저장할 변수 

        String[] spl = polynomial.split(" + "); // " + " 로 string 나누기
        for(int i = 0; i < spl.length; i++){  
            if(spl[i].contains("x")){   // x를 포함하면 x를 없애기
                spl[i] = spl[i].replace("x","");
                if(spl[i].equals("")){  // 1x는 그냥 x로 표시되므로 x가 사라지면 빈값
                    xSum += 1;         // 1만 더해주기
                }
                else{xSum += Integer.valueOf(spl[i]);}  // x합에 더해주기
            }else{
                sum += Integer.valueOf(spl[i]); // x포함하지 않으면 그냥 상수합
            }
        }

        if(xSum == 0 && sum == 0 ){  // xSum과 sum 둘다 0이면 빈값
            answer = "";
        }
        else if(xSum == 0) { // xSum만 0이면 상수값만
            answer = String.valueOf(sum);
        }else if(sum == 0) { // sum만 0이면 x값만
            answer = xSum + "x";
        }else{  // xSum과 sum 둘다 0이 아니면 일반 다항식처럼 표현
            answer = xSum + "x" + " + " + sum;
        }
        return answer;
    }
}
오류 및 개선
  • java.util.regex.PatternSyntaxException  발생
  • 해당 에러는 메타문자로 들어가는 특수문자를 replace, split 등에 사용할 때 발생
  • ex) +, *, (, ),?, [, ] 등은 \\을 넣어주기. "\\+"로 사용
  • 1x + 3 같은 경우 x + 3으로 표시되어야 돼서 테스트케이스 3개 실패
  • 조건마다 문자열에 더해주는 형태 & 삼항연산자가 더 가독성 있어보인다
최종
class Solution {
    public String solution(String polynomial) {
        String answer = "";
        int xSum = 0;  // x값들의 합을 저장할 변수
        int sum = 0;   // 상수항들의 합을 저장할 변수

        String[] spl = polynomial.split(" \\+ "); // " + " 로 string 나누기
        for(int i = 0; i < spl.length; i++){
            if(spl[i].contains("x")){   // x를 포함하면 x를 없애기
                spl[i] = spl[i].replace("x","");
                if(spl[i].equals("")){  // 1x는 그냥 x로 표시되므로 x가 사라지면 빈값
                    xSum += 1;         // 1만 더해주기
                }
                else{xSum += Integer.valueOf(spl[i]);}  // x합에 더해주기
            }else{
                sum += Integer.valueOf(spl[i]); // x포함하지 않으면 그냥 상수합
            }
        }

        if(xSum != 0){  // xSum이 0이 아닐때
            answer += xSum == 1 ? "x" : xSum + "x";  // 1이면 x만 출력 아니면 xSum x 출력
        }
        if(sum != 0){  //sum이 0이 아닐때
            answer += xSum != 0 ? " + " + sum : String.valueOf(sum); 
            // xSum이 0이 아니면 + 붙이고 0이면 바로 숫자만 출력
        }
        return answer;
    }
}
String 클래스 메소드를 숙달해야겠다