[ 문제 ]
여기서 중요하게 봐야할 건, 결괏값을 '문자열'로 return하기!
여기서 잘 봐야할 건, '계수 1는 생략합니다'.
여기서 잠깐 용어 정리를 해보면
- 항 : 숫자 또는 문자의 곱으로 이루어진 식. 숫자와 문자를 곱한 것, 문자와 문자를 곱한 것, 숫자와 숫자를 곱한 것
- ex: 3, 3a, a²
- 다항식 : 1개 이상의 항으로 이루어진 식.
- ex: 3x, 3x+1, 2y-2
- 단항식 : 다항식 중, 항이 1개만 있는 식. (즉, 단항식은 다항식에 포함됨)
- ex: 3x, -2, 1
- 차수 : 문자가 곱해진 횟수
- ex 1) 4x² : x가 두번 곱해졌으므로 차수는 2.
- ex 2) 2y : y가 한 번 곱해졌으므로 차수는 1.
- ex 3) 1 : 문자가 곱해진 것이 없다. 그래서 차수는 0.
- 일차항 : 항의 차수가 1인 항
- ex: 3x, x, y, 14y
- 상수항 : 항 중에서 숫자만 있는 항.
- ex: 1, 2, -3, -7
- 계수 : 숫자와 문자의 곱에서 숫자. 숫자와 문자의 곱에서 곱셈기호를 생략하는데, 문자 앞에 쓰여진 숫자.
- ex: 3y는 3 x y이므로 여기서 계수는 3, a는 1 x a이므로 계수는 1
- 동류항 : 문자와 차수가 같은 항.
- ex: 2x + 4x + 5y 의 경우, 문자와 차수가 같은 항은 2x, 4x. 문자인 x와 차수가 1차인게 같다. 5y는 차수는 같지만 문자가 다르므로 동류항이 아니다.
문제를 정리해보자면,
덧셈으로 이루어진 일차식 '다항식'이 매개변수로 주어지면, 동류항끼리 더한 결괏값을 return하는 함수를 완성하는 것이다.
즉, 예를들면 '2x + 3x + 2' 이렇게 일차식의 다항식이 주어지면, 동류항인 2x, 3x를 더하여 '5x + 2' 이 값을 return하는 함수.
[ 풀이 ]
1/ 매개변수인 다항식을 ' + '를 구분자로 배열로 변환한다. ex: → ['3x', '4x', '7', '8']
2/ 배열로 변환한 걸 'x'의 유무로 각각 새로운 배열에 넣기. ex: ['3x', '4x', '7', '8'] → ['3x', '4x'], ['7', '8']
3/ x가 포함된 항으로 이루어진 배열에서 계수의 합, 상수항으로 이루어진 배열에서 상수의 합 구하기
function solution(polynomial) { //'3x + 4x + 7 + 8'
//1.매개변수인 다항식을 ' + '를 구분자로 배열로 변환
let array = polynomial.split(' + ');//'3x + 4x + 7 + 8'→['3x','4x','7','8']
//2.배열로 변환한 걸 'x'의 유무로 각각 새로운 배열에 넣기.//['3x','4x','7','8']→['3x','4x'],['7', '8']
let linear = []; //['3x','4x'] x있는 항
let constant = []; //['7', '8'] 상수로만 되어있는 항
for(let i = 0; i < array.length; i++) {
if(array[i].includes('x')) { //'x'가 포함되어 있을 경우
if(array[i] === 'x') { //계수가 1인 경우 'x'가 아닌 '1x'로 넣기. 생각해보니 'x'없이 그냥 계수만 넣어도 됐을듯.
linear.push('1x')
} else {
linear.push(array[i])
}
} else { //'x'가 없는 경우(상수항)
constant.push(Number(array[i]));
}
}
//3.x가 포함된 항으로 이루어진 배열에서 계수의 합, 상수항으로 이루어진 배열에서 상수의 합 구하기
let sumOfLinear = 0; //계수들의 합
let sumOfConstant = 0; //상수항의 합
//항의 'x'제외 후, 계수의 합. 3x + 4x → 7
for(let i = 0; i < linear.length; i++) {
sumOfLinear= sumOfLinear + Number(linear[i].slice(0,-1));
}
//상수항들의 합. 7 + 8 → 15
for(let i = 0; i < constant.length; i++) { //상수만 더하기
sumOfConstant = sumOfConstant + constant[i];
}
//계수의 합이 0일 경우, 상수의 합만 '문자열'로 출력
if(sumOfLinear === 0) {
return sumOfConstant.toString();
} else {
//계수의 합이 0이 아닐 경우
if(sumOfLinear === 1) {
sumOfLinear = ''; //계수의 합이 1일 경우에는 생략가능하므로 빈 문자열
}
if(sumOfConstant === 0) { //상수의 합이 0일 경우
return sumOfLinear + 'x'; //계수의 합 + 'x'
}
return sumOfLinear + 'x' + ' + ' + sumOfConstant;// '7x + 15'
}
}
다시 풀다보니 조금 더 간단하게 코드를 짤 수 있을 것 같아 다시 한번 풀어보았다.
function solution(polynomial) {
let array = polynomial.split(' + ');
let linear = [];
let constant = [];
for(let i = 0; i < array.length; i++) {
if(array[i].includes('x')) { //'x'가 포함된 항들은 바로 'x'를 제거해서 linear배열에 추가
if(array[i] === 'x') {
linear.push(1);
} else {
linear.push(Number(array[i].slice(0,-1)))
}
} else {
constant.push(Number(array[i]));
}
}
let sumOfLinear = linear.reduce((acc,cur) => acc + cur, 0);//for문 대신, reduce함수를 사용하여 계수의 합 구하기
let sumOfConstant = constant.reduce((acc,cur) => acc + cur, 0);//for문 대신, reduce함수를 사용하여 상수항의 합 구하기
if(sumOfLinear === 0 && sumOfConstant === 0) {
return '0';
} else {
if(sumOfLinear === 0 && sumOfConstant !== 0) {
return sumOfConstant.toString();
}
if(sumOfLinear !== 0 && sumOfConstant === 0) {
if(sumOfLinear === 1) {
return 'x';
} else {
return sumOfLinear + 'x'
}
} else {
if(sumOfLinear === 1) {
return 'x' + ' + ' + sumOfConstant;;
}
return sumOfLinear + 'x' + ' + ' + sumOfConstant;
}
}
}
그래도 아직 코드가 좀 장황하게 풀어놓은 느낌이다.
다른 사람의 코드를 보는건 많은 도움이 되어 확인해보았다.
function solution(polynomial) { //'3x + 4x + 7 + 8'
const arr = polynomial.split(" + "); //나와 동일하게 ' + '를 구분자로 두어 문자열을 배열로 변환.
const xNum = arr
.filter(n => n.includes("x")) //배열에서 'x'포함된 원소들을 필터링
.map(n => n.replace('x', '') || '1') //'x'를 '' 또는 계수가 1인 'x'같이 'x'를 ''로 변환하면 빈 문자열이 될 경우 '1'로 변환. 즉,'x'를 제거하여 계수만 남도록.
.reduce((acc, cur) => acc + parseInt(cur, 10), 0); //reduce함수를 이용하여 문자열인 계수들을 숫자로 변환하여 합함.
//parseInt(cur, 10)에서 10을 작성할 필요는 없을 것 같다!
const num = arr
.filter(n => !isNaN(n)) //isNaN함수를 이용하여 숫자로만 되어있는 상수항을 필터링
.reduce((acc, cur) => acc + parseInt(cur, 10), 0); //상수항끼리 합한다.
let answer = [];
if(xNum) answer.push(`${xNum === 1 ? "" : xNum}x`); //계수의 합이 0이 아닐 경우, 1이면 'x', 0도 1도 아닐경우 'xNum'+'x'
if(num) answer.push(num); //상수항의 합이 0이 아닐 경우
return answer.join(" + ");//배열에 넣은 값들을 join함수를 이용해 합치기. xNum만 있으면 ' + '가 포함이 안됨.
}
filter, map, join함수를 이용해서 더 간단하게 코드를 작성할 수 있구나.
공부가 많이 되었다 :)
나도 더 간결하고 깔끔한 코드로 작성해봐야겠다.
'자료구조알고리즘 > 프로그래머스' 카테고리의 다른 글
약수의 개수 구하는 방법 (0) | 2023.12.13 |
---|---|
[프로그래머스] 소수 만들기 (0) | 2022.01.26 |
[프로그래머스] Lev1. 약수의 개수와 덧셈 (0) | 2022.01.26 |