[구현] 프로그래머스 '수식 최대화' - 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를 통해 원하는 자리에 넣어준다.
이해에 참고한 블로그)
[프로그래머스] 수식 최대화 - javascript
문제 [programmers.co.kr/learn/courses/30/lessons/67257] 문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승
yoon-dumbo.tistory.com
이번 문제는 정규표현식을 모르면 그냥 막혔을 것 같은 문제다 ㅋㅋㅋㅋㅋㅋㅋㅋ왤케 어렵냐..이게 레벨2인거 실화냐~~!! 코드는 짧지만 문제를 푸는 방식을 생각하는 것 자체가 어렵다고ㅠㅠ
복기
7/4