개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 다항식 더하기

빔네모 2024. 3. 19. 10:13

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

음...더 좋은 방법을 찾고싶다.

일단 "3x + 1" 이런식으로 연산기호 사이에 공백이 존재하니 공백을 기준으로 쪼개 배열을 만든다. => ["3x","+","1"]

3x 같이 일차항인 경우 x를 포함하고 있다면 ~ 으로 조건을 달아 일차항에 누적해준다. 

그외는 isNaN의 반례, 즉 기호가 아닌 숫자가 오는 경우 상수항에 더해준다. 

isNaN(+) => true

isNaN(7) => false

 

일차항, 상수항 둘다 있다면 ax + b 꼴로 반환, 일차항만 있다면 ax, 상수항만 있다면 b 해준다.

 

+++ 제출 케이스에서 틀렸던 부분인데, 일차항이 1인 경우 1x가 아니라 x로 1이 생략되게 출력해야 된다. 

일차항이 1인지 확인하는 조건문 추가..

function solution(polynomial) {
  let 상수항 = 0;
  let 일차항 = 0;

  polynomial.split(" ").forEach((term) => {
    if (term.includes("x")) return (일차항 += parseInt(term.split("x")[0] || 1));
    if (!isNaN(term)) return (상수항 += parseInt(term));
  });

  if (일차항 && 상수항) return 일차항 === 1? `x + ${상수항}` :`${일차항}x + ${상수항}`;
  if (일차항) return 일차항 === 1? "x" :`${일차항}x`;
  if (상수항) return `${상수항}`;
}

 

다른 풀이

공백 포함해서 연산기호를 기준으로 쪼갠다(더하기 밖에 없다는 조건이 있음)

=> ["x","1"] 이런식으로 일차항과 상수만 존재

 

x만 걸래낸 후 map으로 돌면서 3x => 3, x => 1 이런식으로 바꾸고 reduce로 누적해준다. 

상수항은 숫자만 걸러내서 누적해준다. 

일차항이 만약 1이라면 x만 넣고 값이 있다면 ax 형식으로 배열에 넣어준다. 

 

그리고 최종 리턴 값으로 배열을 연산기호와 join해서 반환한다! 

function solution(polynomial) {
    const arr = polynomial.split(" + ");
    const xNum = arr
                .filter(n => n.includes("x"))
                .map(n => n.replace('x', '') || '1')
                .reduce((acc, cur) => acc + parseInt(cur, 10), 0);
    const num = arr
                .filter(n => !isNaN(n))
                .reduce((acc, cur) => acc + parseInt(cur, 10), 0);

    let answer = [];
    if(xNum) answer.push(`${xNum === 1 ? "" : xNum}x`);
    if(num) answer.push(num);

    return answer.join(" + ");
}