GitHub ID : soohyun-dev
윤수현의 개발 공간
GitHub ID : soohyun-dev
전체 방문자
오늘
어제
  • 분류 전체보기 (918)
    • 성장기록 (49)
      • 성장기록 (3)
      • 우아한테크코스 (16)
      • 프로젝트 (15)
      • TIL (14)
      • 테오의 스프린트 (1)
    • 프로그래밍언어 (88)
      • C언어 (14)
      • HTML\CSS (12)
      • JavaScript (7)
      • React (23)
      • Python (11)
      • JAVA (14)
      • TypeScript (6)
    • 알고리즘 공부 (736)
      • 코드업 - 파이썬 (108)
      • 백준 - 파이썬 (468)
      • 백준 - 자바스크립트 (125)
      • 프로그래머스 - 파이썬 (1)
      • 프로그래머스 - 자바스크립트 (34)
    • 책 리뷰 (9)
      • 프로그래밍 (3)
      • 독서 (6)
    • 전자기기 (1)
    • 일상, 일기 (18)
    • 기술 세미나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • 코드업파이썬
  • 백준파이썬
  • 영어독해
  • 프론트엔드
  • 파이썬
  • 프로그래머스자바스크립트
  • 자바스크립트
  • 코딩
  • 영어
  • 코테
  • PYTHON
  • 코드업
  • 독해
  • 백준
  • javascript
  • 백준풀이
  • 코딩테스트
  • 프로그래밍언어
  • 프로그래머스풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GitHub ID : soohyun-dev

윤수현의 개발 공간

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 17214 다항 함수의 적분
알고리즘 공부/백준 - 자바스크립트

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 17214 다항 함수의 적분

2022. 11. 24. 14:27

백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 17214 다항 함수의 적분

 

 

✔️Check Point !   ( 해당사항 ✓체크 )

1. 막힘 없이 수월하게 풀린 문제인가?

2. 1시간이내로 풀렸던 문제인가?

3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

4. 시간을 써도 도무지 풀 수 없는 문제인가?

5. 솔루션을 찾아봤는가?

-------------------------------------------------------------------------------------------

난이도 체감 🧑‍💻
1. 최상
2. 상
3. 중
4. 하


이해도 🙆‍♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함

 

 

문제 출처 🏠

https://www.acmicpc.net/problem/17214

 

17214번: 다항 함수의 적분

첫째 줄에 최대 일차 일변수 다항식이 주어진다. 항의 개수는 최대 2개이고, 변수는 항상 x로 주어지며, 각 항은 공백 문자로 구분되지 않는다. 주어지는 계수는 절댓값이 10,000을 넘지 않는 0이

www.acmicpc.net

 

 

 

문제풀이 소감 🧑‍💻

재밌는 적분 문제~~~

 

처음에 쉽겠지 하고 덤볐는데, 고려할 사항이 너무 많아서 푸는데 시간이 꽤 걸렸다

 

특히, 양수 음수 처리하는 방법이 달라서 이래서 골드문제구나 싶었음.

 

여담으로 미적분 뿐만아니라 다변수, 공업수학1,2, 선형대수도 다 배웠었는데 백준에 적용할 문제들이 꽤 있다.

 

가끔씩 재미로 풀어봐야겠다.

 

근데 역시 손으로 푸는거랑 코드로 구현하는 거랑은 확실한 차이가 있네...  손으로 푸는거보다 몇배는 어렵다

 

 

 

요구사항 📋

다항 함수가 주어지면 그 함수를 적분한 값을 출력하시오.

 

차수는 x의 계수와 같다.

 

ex)

1차항은 x

2차항은 xx

5차항은 xxxxx

로 표기한다.

 

 

- 적분 상수는 "W" 로 표기한다.

 

- 계수가 1일 경우 계수를 생략한다 =>  ex) 1x => x

 

- 이 문제에서는 계수가 분수나 소수일 경우는 고려하지 않아도 된다.

 

- 차수가 같은 항은 단 한번만 주어진다.

 

- 차수 순서대로 식이 주어진다.

 

 

주의 ❗

 

상수항만 주어지는 경우도 처리할 수 있어야한다.

 

상수항 0 만 주어지면 적분 상수만 출력한다.

 

 

다음 입력값을 테스트 해보자.

 

(1)  0

 

(2)  -26x-100

 

(3) 26x-100

 

(4) 25xxxx-26x

 

(5) -100

 

 

해결 전략 📝

 

이 문제는 적분하는게 어려운게 아니고 계수, 상수 구분과 적분한 뒤 식을 이어주는 부분들이 까다롭다.

 

적분하는 방법은 단순계산이지만, 이 과정까지 고려해줄게 생각보다 많다.

 

 

 

풀어보면서 느낀 고려사항들이다.

 

 

1. 첫째 항이 음수일경우 '-' 를 붙이지만 양수일경우 '+' 를 붙이지 않는다.

 

2. 적분상수는 항상 붙는다.

 

3. 계수로 양수,음수 모두 들어올 수 있기 때문에 단순 join('+') 를 사용해서는 풀 수 없다.

 

4. 몇차항인지 첫째항 둘째항 모두 고려해줘야한다.

 

5. 상수항이 꼭 들어온다는 보장이 없고, 차수가 있는 함수가 꼭 들어온다는 보장도 없다. 즉, 상수만 들어오는 경우, 함수만 들어오는 경우를 모두 고려해야한다.

 

 

 

가장 까다로웠던 부분은 -26x-100 에서 -26x 와 -100을 구분해서 계산해주는 부분이였다.

 

26x+100 이라면 단순 x를 splitt 로 구분해서 계산하면 되었지만, 위의 경우 케이스도 고려해야하기 때문에 까다로웠다.

 

고민 끝에 첫째항의 마지막 x의 index를 기준으로 구분해주었다.

 

 

이 부분들만 잘 구분해서 적분 하기 직전까지 로직만 잘 짤 수 있다면 이후는 어렵지 않다.

 

 

 

정답 💯

 

 

const input = require("fs").readFileSync("/dev/stdin").toString().trim();

function solution(expression) {
  const isConst = (expression) => {
    let lastXIndex = 0;
    let noConstant = false;
    expression.split("").forEach((v, i) => {
      if (v === "x") [lastXIndex, noConstant] = [i, true];
    });
    return [lastXIndex, noConstant];
  };

  const makeValue = (XIndex, noConstant) => {
    if (noConstant) {
      return [expression.slice(0, XIndex + 1), expression.slice(XIndex + 1)];
    }
    return [[...expression].join("")];
  };

  const checkExpression = (e, sign) => {
    if (e[0] === "+" || e[0] === "-") [sign, e] = [e[0], e.slice(1)];
    if (e !== "" && Number(e) !== 0) {
      if (Number(e) === CONST) result.push(e + "x");
      else result.push(sign + integral(e.split("")));
    }
  };

  const integral = (value) => {
    const coefficient = +value.filter((v) => v !== "x").join("");
    const degree = value.filter((v) => v === "x").length;
    const integralX = Array.from({ length: degree + 1 }).fill("x");
    let integralCoefficient = coefficient / (degree + 1);
    if (integralCoefficient === 1) integralCoefficient = "";
    return `${integralCoefficient}${integralX.join("")}`;
  };

  const [XIndex, noConstant] = isConst(expression);
  const result = [];
  const CONST = "NAN";
  const Value = makeValue(XIndex, noConstant);

  Value.forEach((v) => {
    checkExpression(v, "");
  });

  result.push(result.length !== 0 ? "+W" : "W");

  return result.join("");
}

console.log(solution(input));
반응형

'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글

백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 2607 비슷한 단어  (0) 2022.11.27
백준/ Gold 1 문제 , 백준 Node.js 자바스크립트 13460 구슬 탈출 2 [BFS, 구현]  (1) 2022.11.25
백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1002 터렛  (0) 2022.11.23
백준/ Silver 1 문제 , 백준 Node.js 자바스크립트 1890 점프 [DFS, DP]  (0) 2022.11.21
백준/ Gold 3 문제 , 백준 Node.js 자바스크립트 1520 내리막 길 [DFS, DP]  (0) 2022.11.20
    '알고리즘 공부/백준 - 자바스크립트' 카테고리의 다른 글
    • 백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 2607 비슷한 단어
    • 백준/ Gold 1 문제 , 백준 Node.js 자바스크립트 13460 구슬 탈출 2 [BFS, 구현]
    • 백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 1002 터렛
    • 백준/ Silver 1 문제 , 백준 Node.js 자바스크립트 1890 점프 [DFS, DP]
    GitHub ID : soohyun-dev
    GitHub ID : soohyun-dev
    환영합니다!😊 이곳은 저의 개발에 관한 내용들을 정리하는 공간입니다. 알고리즘 풀이에도 관심이 많아요. 좋은 하루 되세요~! github : soohyun_dev

    티스토리툴바