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

당당·2023년 4월 23일
0

프로그래머스

목록 보기
41/245

https://school.programmers.co.kr/learn/courses/30/lessons/120863

📔문제

한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.


🚫제한사항

0 < polynomial에 있는 수 < 100
polynomial에 변수는 'x'만 존재합니다.
polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
항과 연산기호 사이에는 항상 공백이 존재합니다.
공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
" + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
"012x + 001"처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.
문자와 숫자 사이의 곱하기는 생략합니다.
polynomial에는 일차 항과 상수항만 존재합니다.
계수 1은 생략합니다.
결괏값에 상수항은 마지막에 둡니다.
0 < polynomial의 길이 < 50


📝입출력 예

polynomialresult
"3x + 7 + x""4x + 7"
"x + x + x""3x"

📝입출력 예 설명

입출력 예 #1

"3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.


입출력 예 #2

"x + x + x"에서 동류항끼리 더하면 "3x"입니다.


🧮알고리즘 분류

  • 수학
  • 시뮬레이션
  • 문자열
  • 사칙연산

📃소스 코드

class Solution {
    public String solution(String polynomial) {
        String answer = "";
        String[] eachHang=polynomial.split(" ");
        int number=0;
        int xnumber=0;
        String temp="";
        boolean isRoop=true;
        
        for(int i=0;i<eachHang.length;i++){
            if(isNumber(eachHang[i])){//숫자
                number=number+Integer.valueOf(eachHang[i]);
            }
            else if(eachHang[i].length()==1){ //숫자가 아님, 그냥 계수가 1임 또는 + 연산자
                if(eachHang[i].equals("x")){ 
                    xnumber=xnumber+1;
                }
                else if(eachHang[i].equals("+")){
                    continue;
                }
            }
            
            else{//4x, 3x같은거
                int count=0;
                while(isRoop){
                    if(eachHang[i].charAt(count)=='x'){
                        temp=eachHang[i].replace("x","");
                        xnumber=xnumber+Integer.valueOf(temp);
                        break;
                    }
                    count++;
                }
            }
        }
        
        

        if(number==0){
            if(xnumber==1){
                answer="x";
            }
            else{
                answer=String.valueOf(xnumber)+"x";
            }
            
        }
        else if(xnumber==0){
           answer=String.valueOf(number);
        }
        else{
            if(xnumber==1){
              answer="x + "+String.valueOf(number);
            }
            else{
                answer=String.valueOf(xnumber)+"x + "+String.valueOf(number);
            }
             
        }
        return answer;
    }
    
    public static boolean isNumber(String s){
        try{
            Integer.valueOf(s);
            return true;
        }
        catch(NumberFormatException e){
            return false;
        }
    }
}

📰출력 결과


📂고찰

조금 걸렸다!

isNumber메소드를 만들어 숫자이면 true를 반환하고 숫자가 아니면 false를 반환한다.

각각의 항을 eachHang배열에 넣어서 공백으로 구분했다.(""이라 해서 결과가 이상했다)

만약 숫자가 아니고, 문자열 길이가 1이면 x 아니면 +이다.
만약 x라면 xnumber(x항의 계수 저장하는 거)에 1을 더해주고,
+라면 그냥 다음 반복문으로 넘어간다.

이제 이게 처리가 어려웠다. 만약, 숫자도 아니고 x도 아니고 +도 아니면
35x와 같은 식이 되는 것이다. (7x같은 한자리 계수만 생각해서 틀렸다)
while문을 사용했다. 문자열에서 x를 만날 때 까지 반복문을 돌리고,
만약 문자열이 x를 만나면 문자열에서 x를 없앤 그 수만 xnumber에 저장한다. (여기서 isRoop를 false로 줘서 그다음에 또 x항 계수가 나왔을 때 저장이 안돼서 값이 이상했다.)

그리고 마지막으로, x만 출력될 때는 계수 1은 생략해야 한다.
(이것도 안해줬다..)

이걸 다 만족하면.. 해결된다.

profile
MySQL DBA 신입 지원

0개의 댓글