본문 바로가기
알고리즘/Programmers

[TIL] 2023.04.10 Programmers_다항식 더하기

by heereal 2023. 4. 11.

Today I Learned

  • Programmers 문제 풀기

 


Programmers 문제 풀기

다항식 더하기

나의 풀이

function solution(polynomial) {
    const array = polynomial.split(" ").filter((v) => v !== "+");
    const answer = array.reduce((acc, cur) =>  {
        if ( cur.includes("x") ) {
            cur.length === 1 ? acc[0] += 1 : acc[0] += parseInt(cur)
        } else if ( !isNaN(parseInt(cur)) ) {
            acc[1] += parseInt(cur)
        }
        return acc
    }, [0,0])
    return (answer[0] ? answer[0] === 1 ? "x" : answer[0] + "x" : "") 
        + (answer.includes(0) ? "" : " + ") 
        + (answer[1] ? answer[1] : "");
}

풀긴 풀었는데 썩 마음에 드는 풀이는 아니다.

 

일단 polynomial를 배열로 만든 후에 +를 제외한 요소들만 필터링한다. 그리고 reduce 메서드를 이용해서 initialValue에 [0,0]을설정한 다음에 배열의 각 요소가 일차항인 경우와 상수항인 경우로 나눠서 initialValue에 값을 더해준다. 그리고 reduece 메서드로 만든 배열을 삼항 연산자를 이용해서 다시 문자열 형태의 다항식으로 출력했다.

 

 

다른 사람의 풀이

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(" + ");
}

참고할 부분

  1. split을 " "이 아니라 " + "로 하면 배열을 따로 filter할 필요가 없어진다.
  2. 배열을 따로 만들어서 if문으로 true일 때만 (값이 0이 아닐 때만) push를 하면 삼항 연산자로 예외 처리를 해줄 필요가 없어진다.
  3. 최종적으로 배열을 " + "로 조인한 문자열을 반환한다!

 

풀이에서 map을 돌리는데 or 연산자를 사용하는 부분이 이해가 잘 안됐는데 ChatGRT에게 물어본 결과 replace한 결과물이 빈 문자열일 때만 '1'로 대체하는 코드라고 한다.

replace() 함수를 사용해서 배열의 각 요소 n에서 'x'를 제거합니다. 만약 문자열에 'x'가 없다면, 아무 변화 없이 원래 문자열이 그대로 반환됩니다. 만약 제거된 결과가 빈 문자열이라면, 해당 요소를 '1'로 대체합니다. 이때, || 연산자를 사용하여 빈 문자열이면 '1'을 반환합니다.

 

  • false || '' || 0 || null || 'Value!!' || undefined → 결과: 'Value!!'
  • false || '' || 1 || null || NaN || undefined → 결과: 1

아마 OR 연산자의 이런 속성을 이용한 거 같다!

 


회고

오늘은 점핏에 이력서를 등록하고 원티드까지 포함해서 이력서를 5개 정도 넣었다. 근데 이력서 계속 수정하고 면접 준비하는 건 너무 재미없어서 차라리 프로젝트를 하나 시작해 볼까 하는 생각이 든다. 뭔가 생산적이고 재밌는 일을 하고 싶다! 일단 내일은 오후에 인텔리픽 모의면접 일정이 있기 때문에 또 면접 준비를 해야겠다. 

 

 

 

댓글