프로그래머스[Level 2] 수식 최대화

bkboy·2022년 6월 29일
0
post-thumbnail

문제

링크

제한 사항

입출력 예

풀이

const permutations = function* (elements, selectNumber) {
  if (selectNumber === 1) {
    yield elements.map((e) => e);
  } else {
    const [first, ...rest] = elements;

    for (const a of permutations(rest, selectNumber - 1)) {
      for (let i = 0; i < elements.length; i++) {
        const start = a.slice(0, i);
        const ended = a.slice(i);
        yield [...start, first, ...ended];
      }
    }
  }
};

const calulate = (a, b, exp) => {
  if (exp === "*") return a * b;
  else if (exp === "-") return a - b;
  else return Number(a) + Number(b);
};

function solution(expression) {
  const exp = expression.split(/(\D)/);

  let answer = Number.MIN_SAFE_INTEGER;
  for (let priority of permutations(["+", "-", "*"], 3)) {
    let tmp = [...exp];
    for (let x of priority) {
      while (tmp.includes(x)) {
        let idx = tmp.indexOf(x);
        tmp.splice(idx - 1, 3, calulate(tmp[idx - 1], tmp[idx + 1], x));
      }
    }
    answer = Math.max(answer, Math.abs(tmp[0]));
  }
  return answer;
}

세가지 연산자를 가지고 가능한 순열을 만들었다. 각 순열의 순서를 우선 순위라고 가정하고 탐색을 진행했다.

해당 연산자의 위치를 연산자 + 숫자가 같이 들어있는 배열을탐색하면서 찾고 앞뒤로 같이 빼주고 연산한 것을 그자리에 넣어준다.

splice의 세번째 인자로 해당위치에 값을 넣어줄 수 있다는 것을 알았다.

profile
음악하는 개발자

0개의 댓글