본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '수식 최대화' - js

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2. 코드

이 문제를 처음 풀었을 때는 문제를 착각해 연산자 별 우선순위가 정해지면 우선순위가 높은 연산자 순으로 계산되어야하는 걸 잊고, 그냥 어떤 순서대로 계산해야 최댓값이 나오는지만 DFS를 사용해 구해주었다. 

문제를 정확히 파악해야 한다. 한 번 우선순위를 정하면 그 우선순위 순서대로 계산이 되어야 한다.

구글링하여 잘 설명이 되어있는 블로그를 읽고 이해했다.

function solution(expression) {
    const prior = [
        ['-', '*', '+'],
        ['-', '+', '*'],
        ['*', '-', '+'],
        ['*', '+', '-'],
        ['+', '-', '*'],
        ['+', '*', '-']
    ];
    let answer = [];

    for (let arr of prior) {
        const temp = expression.split(/(\D)/);
        for (let exp of arr) {
            while (temp.includes(exp)) {
                const idx = temp.indexOf(exp)
                temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join('')));
            }
        }
        answer.push(Math.abs(temp[0]));
    }
    
    return Math.max(...answer);
}

기억해야 할 점이 두 가지가 있다.

첫째로, 입력된 식을 ['100', '-', '200', '*', '300', '-', '500', '+', '20']과 같이 배열의 형태로 담아두기 위해 아래와 같은 정규표현식을 사용한다.

// \D는 숫자가 아니라는 것을 뜻한다. 즉 숫자가 아닌 것 기준으로 split한다.
const temp = expression.split(/(\D)/);

두번째로, eval문자로 표현된 JavaScript 코드를 실행하는 함수이다.

temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join('')));

idx-1부터 idx-2까지의 요소를 join을 통해 하나의 문자열로 만들어준 후 그 계산값을 splice를 통해 원하는 자리에 넣어준다.

 

이해에 참고한 블로그)

https://yoon-dumbo.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%98%EC%8B%9D-%EC%B5%9C%EB%8C%80%ED%99%94-javascript

 

[프로그래머스] 수식 최대화 - javascript

문제 [programmers.co.kr/learn/courses/30/lessons/67257] 문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승

yoon-dumbo.tistory.com

 

이번 문제는 정규표현식을 모르면 그냥 막혔을 것 같은 문제다 ㅋㅋㅋㅋㅋㅋㅋㅋ왤케 어렵냐..이게 레벨2인거 실화냐~~!! 코드는 짧지만 문제를 푸는 방식을 생각하는 것 자체가 어렵다고ㅠㅠ

 

복기

7/4
반응형