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

자경·2024년 7월 31일
0

programmers

목록 보기
1/3

프로그래머스|Lv0 : 다항식 더하기

🫧문제

🎁문제

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

🪄제한

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



👻풀이(java)

◾1 첫시도

class Solution {
    public String solution(String polynomial) {
        String temp = polynomial.replace(" ",""); //공백없애기
        String arr[] = temp.split("\\+"); //더하기를 기준으로 분리한다. 
        
        //각 x의 계수와 정수를 계산하는 변수
        int x = 0;
        int num = 0;
        String answer = ""; 
        
        //항의 개수가 2개가 아닐 시(2개일 시 그대로 반환)
        if(arr.length!=2){
            for(int i=0; i<arr.length; i++){
                if(arr[i].contains("x"))
                	
                    //엑스를 떼어내었을 때 null이라면 1, 아니라면 계수 그대로를 저장.
                    x += ((arr[i].replace("x","")).equals(""))? 1 : Integer.parseInt(arr[i].replace("x","")); 
                // 정수일 경우를 감지
                else if(!(arr[i].equals(""))){
                    num += Integer.parseInt(arr[i]);
                }  
            }
            
            //x의 계수나 양의 정수 둘 중 하나가 0일 경우를 대비
            answer = (x>0&&num>0)? x+"x + "+num : (x>0&&num<=0)? x+"x" : num+"";
        }
        
        //항이 2개라면에 대한 경우 처리
        else if(arr.length==2){
            answer = polynomial;
        }
        return answer;
    }
}

많이 드릅다
여러분의 눈은 소중하다

코드설명 :

항의 개수를 세서 공백과 덧셈기호로 나눈다음, x의 계수와 양의 정수를 각각 더하여 센다. 그 후 x의 계수는 x문자에 붙인 상태로 양의 정수와 함께 return 한다.

결국 위의 코드는 항이 2개에 대해 집착한다.("x + 4"인 경우 라던가)

만약 "2 + 2", "2x + 7x"라면?? -> 이에 대한 고려가 안돼있다.




◾2(성공🥳)

class Solution {
    public String solution(String polynomial) {
        String temp = polynomial.replace(" ","");
        String arr[] = temp.split("\\+");
        
        int x = 0;
        int num = 0;
        String answer = "";
        
        //x에 대한 계수와 정수에 대한 합을 진행한다. 
        for(int i=0; i<arr.length; i++){
            if(arr[i].contains("x"))
                x += ((arr[i].replace("x","")).equals(""))? 1 : Integer.parseInt(arr[i].replace("x",""));
            else if(!(arr[i].equals(""))){                    num += Integer.parseInt(arr[i]);
            }  
        }
        
        //x계수, 정수의 접합 수술을 진행한다.
        answer += (x==0)? "": (x==1)? "x": x+"x";
        answer += (num==0)? "": (answer.length()>0)? " + "+num : num ;
        
        return answer;
    }
}

삼항연산자가 드러워보인다

코드 설명 :
다항식을 할당하는 변수 answer에 x의 계수, 정수에 대한 예외 사항을 적용하여 각각 적용한다. 예외는 다음과 같다.

x의 계수나 정수가 0일때 -> 다항식에 표기되지 말아야한다.
x의 계수가 1일때 -> "x"

또한 " + "의 형태로 피연산자가 이어져야한다.
ㄴ-> 해결 : 뒤에 오는 정수에 조건에 포함했다.
(만약 앞에 항이 있다면 " + "를 포함한 형태로 할당되게끔🫥 length()이용)

아쉬운 점 : 코드자체가 길고 한 눈에 이해가 어렵다. 특히 각 계수를 세는 방법이나 answer를 따로 할당하는 방법이 깔끔하지 않다. 알고리즘 자체의 변화가 있었으면 하는 아쉬움이 있었다. 🥲



🌼다른 사람의 풀이


class Solution {
    public String solution(String polynomial) {
        int xCount = 0;
        int num = 0;

        for (String s : polynomial.split(" ")) {
            if (s.contains("x")) {
                xCount += s.equals("x") ? 1 : Integer.parseInt(s.replaceAll("x", ""));
            } else if (!s.equals("+")) {
                num += Integer.parseInt(s);
            }
        }
        return (xCount != 0 ? xCount > 1 ? xCount + "x" : "x" : "") + (num != 0 ? (xCount != 0 ? " + " : "") + num : xCount == 0 ? "0" : "");
    }
}

🥺
처음봤을때 코드가 정말 잘생기고 이쁘다는 생각이 들었다.
역시 다른 사람의 풀이에서 배울 것이 너무 많다.


배운 점

for (String s : polynomial.split(" "))
split으로 인한 분리를 따로 어딘가에 할당하지 않고 바로 for-each문으로 순환하였다.

만약 x를 포함하고 있다면 계수를 떼어서 xCount에 더해주었다. 그에 반해 정수라면 num이라는 정수의 합을 세는 변수에 수를 추가해주었다.

return (xCount != 0 ? xCount > 1 ? xCount + "x" : "x" : "") + (num != 0 ? (xCount != 0 ? " + " : "") + num : xCount == 0 ? "0" : "");
계산된 다항식을 삼항을 통한 예외처리 후 별도의 변수에 할당없이 바로 반환하였다. 😍😍😍

삼항연산자를 한 줄로 썼음에도 각 부분별 예외처리가 자세히 보인다.

이목구비가 뚜렷한 코드같다 🤔🤔


반성

삼항을 쓸때 각 섹션별 분류가 중요할 듯하다.
또한 변수에 사용이 정말 필요한가 다시 생각해보는 것도 좋을 듯하다.
최적화와 연관이 되어있으니🥺

0개의 댓글