다항식 더하기

Haizel·2023년 4월 7일
0

🧬 알고리즘 풀이

목록 보기
4/53
post-thumbnail

문제 설명

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

입출력 예

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

내 첫 풀이

function solution(polynomial) {
  const result = polynomial.split(" "); // ["3x","+","7","+","x"]
  let xValue = 0;
  let numberValue = 0;
for(let el of result){
    console.log(el);
 if(el.includes("x")){
     if(el[0] === "x"){
         xValue++;
     } else {
         xValue += el[0];
     }
 } else if(!el.includes("x") && !(el === "+") && (el > 0)){
      numberValue += Number(el);
 }
    }
    if(numberValue === 0){
        return `${xValue}x`;
    }
    return `${xValue}x + ${numberValue}`;
    
}

💡 코드 풀이
  1. polynomial의 각 요소를 띄여쓰기로 분리하고, x값과 상수를 더해줄 변수를 선언한다.
  2. 반복문을 돌면서 각 요소에 x가 있으면 xValue에 더해주고, x 요소가 없고 & ‘+’ 가 아니라면 numberValue에 더해준다.
  3. 1) 마지막으로 numberValue가 0 이라면 0을 제외하고, 2)1x라면 1의 값을 제외해 리턴하고, 3) 그 외에는 ${xValue}x + ${numberValue} 의 형태로 리턴하겠금 코드를 짰다.

💡 개선할 점
  1. 일단 너무 복잡하다.
  2. 기본 테스트 케이스 2개는 통과 됐지만 전체 테스트 케이스는 통과하지 못했다.

→ 즉 내가 반례를 고려하지 않았고, 가독성도 나쁜 코드를 짰다 😇

💡 생각해야할 조건
  1. x값 & 상수값 모두 존재
  2. x 값만 존재 & 상수 없음
  3. 1x라면 → x만
  4. 상수값만 존재 & x 값 없음
  5. x값 & 상수값 모두 없음 → 0 리턴 (”0” 아님)

내 두번째 풀이

function solution(polynomial) {
    const Newpolynomial = polynomial.split(" "); // ["3x","+","7","+","x"]
    let xValue = 0;
    let numberValue = 0;
    for(let el of Newpolynomial){
          //1. x값일때,
         if(el.includes("x")){ 
        if(el[0] === "x") xValue++; //1-1.그냥 x라면 === 즉 1x
        else xValue += el[0];  //1-2. 3x라면 === 즉 1이상일때
        } //2. 상수 값일 때,
          else if(!(el === "+") && (el > 0)) numberValue += Number(el);
    } 
    //3. 리턴 조건은 5개로, 각 조건에 맞게 리턴문을 작성한다.
    //3-1. x 값 & 상수값 모두 존재
    if(xValue > 0 && numberValue > 0) return `${xValue}x + ${numberValue}`;
    //3-2. x 값만 존재 & 상수 없음
    if(numberValue === 0) return `${xValue}x`;
    //3-3. 1x라면 → x만 
    if(xValue === 1) return `x + ${numberValue}`;
    //3-4. 상수값만 존재  & x 값 없음
   if(xValue === 0) return `${numberValue}`;   
    //3-5. x값 & 상수값 모두 없음
    if(xValue === 0 && numberValue === 0) return Number(0);   
}

💡 문제점
  • 테스트케이스의 절반밖에 통과하지 못했다 😭

보완한 풀이

function solution(polynomial) {
  //1-1. polynomial의 각 요소를 띄여쓰기로 분리하고 "+"가 아닌 요소들만 필터링한다.
  polynomial = polynomial.split(' ').filter((e) => e !== '+'); 
  //1-2. 그리고 x값과 상수를 더해줄 변수를 선언한다.  
  let xNum = 0;
  let num = 0;
  /* 2. forEach()로 각 요소를 순회 -> forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행 */  
  polynomial.forEach((e) => {
      if (e.includes('x')) {
          const x = e.split('x');
          if (x[0] === '') xNum++;  //2-1. (1)x인경우
          if (x[0] !== '') xNum += Number(x[0]); //2-2. 3x인경우
      }
      
      if (!e.includes('x')) num += Number(e); //2-3. 상수인 경우
  })
  //3. 리턴 조건은 5개로, 각 조건에 맞게 리턴문을 작성한다.
  //3-1. xValue와 numberValue가 있고 1)xValue가 1인 경우와 2) 1 이상인 경우  
  if (xNum !== 0 && num !== 0) return xNum === 1 ? `x + ${num}` : `${xNum}x + ${num}`;
  //3-2. xValue만 있고 1)xValue가 1인 경우와 2) 1 이상인 경우  
  if (xNum !== 0 && num === 0) return xNum === 1 ? 'x' : `${xNum}x`;
  //3-3. numberValue만 있는 경우  
  if (xNum === 0 && num !== 0) return `${num}`;
  //3-4. xValue와 numberValue 둘다 없는 경우  
  if (xNum === 0 && num === 0) return '0';
}
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글