Skip to content

Latest commit

 

History

History
70 lines (50 loc) · 3.87 KB

80.md

File metadata and controls

70 lines (50 loc) · 3.87 KB

다항식 더하기

문자열을 숫자처럼 잘 다루는 방법은? + 가독성 + 예외찾기

이 문제는 문자열로 된 다항식을 어떻게 더하는 방법에 대한 문제이다. 자바스크립트에서는 문자열이 + 연산자로 결합이 된다. 그래서 실제적인 계산이 진행되기 위해선 다항식에서의 숫자만을 파싱(?)해서 더해주는 작업을 해야한다. 다행히 이 문제는 다항식에서 나올 수 있는 항과 연산자가 간단한 편이였다.

다항식의 구성은 양의 정수, 공백, x, + 로 이루어져있다.

나의 로직은 이렇다.

  1. 공백으로 다항식 문자열을 자른다 → 공백을 따로 제거할 필요 없어진다.
  2. 여기서 추가로 + 만을 필터링 한다.
  3. 이제 다항식 중에 남겨진 것은 양의 정수와 x항 두가지이기 때문에 이 둘을 구분해서 더해주는 로직을 짜면 된다.
function solution(polynomial) {
  const eq = polynomial.split(' ').filter((t) => t !== '+');

  let x = 0,
    n = 0;
  for (const term of eq) {
    if (term.includes('x')) {
      x += Number(term.slice(0, -1)) || 1;
    } else n += Number(term);
  }

  return `${x ? `${x}x` : ''}${x && n ? ' + ' : ''}${n ? n : ''}`;
}

이렇게 로직을 구현했는데, 테스트 코드를 75점을 맞았다. 응?? 왜??

고민 끝에 반례를 찾게 되었다. 그리고 그 반례는 계수 1은 생략합니다. 이 조건에 대한 것이였다. 1x => x라고 표기해야하는데 위 로직으로는 1x라고 표기하게된다. 그래서 아래 코드 처럼 수정하였다.

function solution(polynomial) {
  const eq = polynomial.split(' ').filter((t) => t !== '+');

  let x = 0,
    n = 0;
  for (const term of eq) {
    if (term.includes('x')) {
      x += Number(term.slice(0, -1)) || 1;
    } else n += Number(term);
  }

  return `${x ? `${x === 1 ? '' : x}x` : ''}${x && n ? ' + ' : ''}${
    n ? n : ''
  }`;
}

결론

코드의 로직을 구현하면서 어떻게하면 좀 더 깔끔하게 코드를 짤수 있을지 고민을 많이되었던 문제였다. 조건문을 어떻게 하면 좀 더 깔끔하게 쓸 수 있을지, 예외 케이스는 어떻게 걸러내는 것이 좀 더 깔끔한지 등에 대해서 고민하였다. 그럼에도 return문을 살펴보면 가독성의 측면에서 굉장히 번잡스러움이 느껴진다. 결과적으로 어떤 것을 리턴하려고 하는지 한 번에 알기 어렵긴하다.

const xTerm = x ? `${x === 1 ? '' : x}x` : ''; // x항
const plus = x && n ? ' + ' : ''; // + 연산자 유무
const constantTerm = n ? n : ''; // 상수항

return `${xTerm}${plus}${constantTerm}`;

이렇게 바꿔보면 좀 더 알아보기 편할까? 물론 term이라는 단어가 식에서 항, 무슨 무슨 항 할때의 수학적 용어라 바로 이해하기 어려울 수 도 있지만, 위에서 코드보다는 좀 더 깔끔해진 느낌이다. 각각의 항이 어떤식으로 생겨나는지는 조건문을 봐야하겠지만 그럼에도 결과적으로 이 함수가 무엇을 리턴하는구나에 대해서는 좀 더 명확해진 것 같긴하다.

나의 코드만 뭔가 조건이 많고 그런 것인지를 확인하기 위해서 다른 풀이들도 살펴보았다. 내부 로직적인 부분에서는 크게 문제가 없어보였다. 단, template string 을 이용하는 순간부터 뭔가 가독성이 좀 더 떨어지는 것으로 보인다. 어떤 풀이는 배열의 선언적인 메소드를 통해서 문제 풀었는데, 상대적으로 각각의 코드들이 무엇을 하기 위함인지 좀 더 명확하게 알 수 있었다.

그리고 마지막으로 이 문제는 레벨0임에도 6점이라는 매우 큰 포인트를 주는 문제였다. 이러한 결과를 보니 코드를 작성하기까지 어느정도 고민을 한 부분에 대해서 납득이 되었다. 0레벨임에도 말이다. 😅