백준/ 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
문제풀이 소감 🧑💻
재밌는 적분 문제~~~
처음에 쉽겠지 하고 덤볐는데, 고려할 사항이 너무 많아서 푸는데 시간이 꽤 걸렸다
특히, 양수 음수 처리하는 방법이 달라서 이래서 골드문제구나 싶었음.
여담으로 미적분 뿐만아니라 다변수, 공업수학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 |