Post

다항식 더하기

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

📔 문제 설명

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

💡 입출력 예

polynomialresult
“3x + 7 + x”“4x + 7”
“x + x + x”“3x”

💻내가 작성한 코드

  • 주어진 문자열 더하기를 기준으로 나누고 배열로 변환하기
  • x가 포함된 배열만, 필터링해서 xArr에 저장하기
  • xArr 맵돌면서 x일 경우에는 1만 반환, 아닐 경우에는 x를 없애고 숫자만 반환
  • x 값 모두 더해서 countX에 저장하기
  • 배열에 x가 포함되지 않은 수만 필터링해서 numArr에 저장하기
  • numArr의 길이가 1이면 첫번째 인덱스값 반환, 아닐 경우에는 숫자만 모두 더한 값 저장
  • x = countX 가 0보다 작으면 빈 문자열 반환 c- ountX가 1보다 큰 경우에는 countX 반환, 1인경우에는 빈문자열 반환
  • num = countNum이 0보다 크면 countNum 반환 아닐경우 빈 문자열 반환
  • plus = x가 빈 문자열이 아니고, num도 빈 문자열이 아닐 경우 반환
  • x + plus + num 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function solution(polynomial) {
  const arr = polynomial.split(" + ");

  // x값 계산
  const xArr = arr.filter((v) => v.includes("x"));
  if (xArr.length > 0) {
    var countX = xArr
      .map((a) => (a === "x" ? "1" : a.replace("x", "")))
      .reduce((acc, cur) => acc * 1 + cur * 1);
  }

  // 숫자 계산
  const numArr = arr.filter((v) => !v.includes("x"));
  if (numArr.length > 0) {
    var countNum =
      numArr.length === 1
        ? Number(numArr[0])
        : numArr.reduce((acc, cur) => acc * 1 + cur * 1);
  }

  const x = countX > 0 ? `${countX > 1 ? countX : ""}x` : "";
  const num = countNum > 0 ? countNum : "";
  const plus = x !== "" && num !== "" ? " + " : "";

  return x + plus + num;
}

💻다른 사람 코드

  • 문자열을 공백을 기준으로 나누고, +가 아닌 값만 필터링 하기 (연산제외 숫자값 배열)
  • x = x만 가진 문자열을 필터링 하고, 맵돌면서 숫자값 반환하기
  • n = x를 가지지 않은 문자열만 필터링하고, 숫자값 반환하기
  • x값, n값 더해서 ans 배열에 집어넣기
  • ans[0]이 1x라면 x 값으로 재할당
  • ans 배열 ‘ + ‘을 기준으로 합치기
  • 배열의 값이 하나라면 값만 리턴, ‘ + ‘을 기준으로 합칠 것이 없기때문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function solution(polynomial) {
  let p = polynomial.split(" ").filter((v) => v !== "+");
  let x = p
      .filter((v) => v[v.length - 1] === "x")
      .map((v) => (v.length === 1 ? 1 : +v.slice(0, -1))),
    n = p.filter((v) => v[v.length - 1] !== "x").map((v) => +v);

  let ans = [];
  if (x.length) ans.push(x.reduce((a, v) => a + v) + "x");
  if (n.length) ans.push(n.reduce((a, v) => a + v) + "");

  if (ans[0] === "1x") ans[0] = "x";

  return ans.join(" + ");
}
This post is licensed under CC BY 4.0 by the author.