jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 자바스크립트 입력 템플릿
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 25632 소수 부르기 게임
  • safari invalid date error
  • 1753 최단경로 javascript
  • 자바스크립트 채팅방 스크롤
  • 외벽 점검 javascript
  • 리액트 프로젝트 디버깅하기
  • 덧칠하기 javascript
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 병합정렬 자바스크립트
  • JavaScript
  • 대충만든자판 javascript
  • 자바스크립트 이벤트 위임
  • fetch 취소하기
  • 자바스크립트 모듈 시스템
  • 자바스크립트 커링
  • 13460 javascript nodejs
  • safari Date format NaN
  • 자바스크립트 sort는 왜 그모양일까
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 백준 17406 nodeJS
  • 리코쳇 로봇 javascript
  • javascript use strict
  • 프로그래머스 숫자카드나누기 javascript
  • 가사 검색 자바스크립트
  • 퀵정렬 자바스크립트
  • 계수정렬 자바스크립트
  • 자바스크립트 배열의 특수함
  • 억억단을 외우자 javascript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

[프로그래머스] 수식 최대화 - 자바스크립트
DS & Algorithm/programmers

[프로그래머스] 수식 최대화 - 자바스크립트

2021. 6. 30. 17:41

문제

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

 

코드

function solution(expression) {
  function calculator(a, b, oper) {
    if (oper === "+") return a + b;
    if (oper === "*") return a * b;
    if (oper === "-") return a - b;
  }
  const combinations = [
    ["+", "*", "-"],
    ["+", "-", "*"],
    ["*", "+", "-"],
    ["*", "-", "+"],
    ["-", "*", "+"],
    ["-", "+", "*"],
  ];
  let answer = Number.MIN_SAFE_INTEGER;

  combinations.forEach((combination) => {
    const operands = expression.match(/[0-9]+/g).map(Number);
    const operators = expression.match(/[\*\+\-]/g);
    combination.forEach((c) => {
      let idx = operators.indexOf(c);
      while (idx !== -1) {
        operands[idx] = calculator(operands[idx], operands[idx + 1], c);
        operands.splice(idx + 1, 1);
        operators.splice(idx, 1);
        idx = operators.indexOf(c);
      }
    });
    if (answer < Math.abs(operands[0])) answer = Math.abs(operands[0]);
  });
  return answer;
}

 

풀이

입출력 예시

 

풀이 순서는 다음과 같다.

 

1. [+, *, -] 연산자의 우선순위를 반영한 6개 경우의 수를 배열로 만들어둔다.
    (연산자의 개수가 2개 혹은 3개이므로 경우의 수를 함수로 만들어서 개수에 따라 달리할 수도 있지만
    최대 경우의 수가 6개이므로 더 번거로운 일이라 생각했다.)

 

2. 각 경우에 대해서, 문자열 expression으로부터 연산자, 피연산자를 각각 배열에 분리해두고
    연산자 우선순위를 고려해서 차례대로 연산을 해준다.
    ex) +, *, - 순으로 우선순위가 있다면 연산자가 담긴 배열의 첫번째 인덱스부터 순차적으로 조회하면서
          모든 + 연산을 처리하고, 다음으로 * 연산을 모두 처리하고, -의 연산을 모두 처리하면 된다.
          연산자 배열 0번 인덱스에 있는 연산자를 처리할 때, 피연산자 배열 0,1번 인덱스에 있는 피연산자를 이용한다.

 

3. 각 경우의 우선순위를 고려한 최종 연산 결과를 가지고 절댓값을 취해주고 값이 최댓값이라면 최댓값을 갱신해준다.

 

4. 모든 경우의 수에 대해 1-3번 단계를 수행한 최댓값이 문제의 정답이다.

 

주석을 포함한 코드

function solution(expression) {
  function calculator(a, b, oper) {
    if (oper === "+") return a + b;
    if (oper === "*") return a * b;
    if (oper === "-") return a - b;
  } // 문자열 형태의 연산자를 입력받아 해당 연산을 수행한다.

const combinations = [
    ["+", "*", "-"],
    ["+", "-", "*"],
    ["*", "+", "-"],
    ["*", "-", "+"],
    ["-", "*", "+"],
    ["-", "+", "*"],
  ]; // 6가지 경우의 수를 선언

  let answer = Number.MIN_SAFE_INTEGER;

  combinations.forEach((combination) => {
    const operands = expression.match(/[0-9]+/g).map(Number); // operands에 피연산자를 담고 문자열을 숫자로 형변환
    const operators = expression.match(/[\*\+\-]/g); // operators에 연산자를 담는다. 
    combination.forEach((c) => { // 모든 경우의 수에 대해 작업을 수행한다.
      let idx = operators.indexOf(c);
      while (idx !== -1) {
        operands[idx] = calculator(operands[idx], operands[idx + 1], c);
        operands.splice(idx + 1, 1);
        operators.splice(idx, 1);
        idx = operators.indexOf(c);
      } // 더이상 operators 배열에 해당하는 연산자가 없을 때 까지 반복한다.
          // 0번 인덱스에서 연산자가 발견되었을 때 피연산자 배열의 0,1번 피연산자로 계산을 한다.
        // 피연산자 배열의 0번 인덱스에 연산 결과를 넣고, 연산자 0번 인덱스, 피연산자 1번 인덱스에 있는 원소를 제거한다.
        // 작업이 끝나면 연산자 배열에 찾으려는 연산자가 더 존재하는지 검사하고 존재한다면 위의 작업을 반복수행한다.
    });
    // 마지막 연산은 피연산자의 0,1번 인덱스 + 연산자의 0번 인덱스가 사용되며 피연산자 인덱스 0번에 최종 연산 결과가 담긴다.
    if (answer < Math.abs(operands[0])) answer = Math.abs(operands[0]); // 절댓값을 취해서 최댓값 갱신 여부를 판단한다.
  });
  return answer;
}
저작자표시

'DS & Algorithm > programmers' 카테고리의 다른 글

[프로그래머스] 거리두기 확인하기  (0) 2021.12.16
[프로그래머스] 2개 이하로 다른 비트 - 자바스크립트  (0) 2021.06.30
[프로그래머스] 행렬 테두리 회전하기 - 자바스크립트  (0) 2021.06.29
[프로그래머스] 프렌즈4블록 - 자바스크립트  (0) 2021.06.29
[프로그래머스] 방금그곡 - 자바스크립트  (0) 2021.06.28
    'DS & Algorithm/programmers' 카테고리의 다른 글
    • [프로그래머스] 거리두기 확인하기
    • [프로그래머스] 2개 이하로 다른 비트 - 자바스크립트
    • [프로그래머스] 행렬 테두리 회전하기 - 자바스크립트
    • [프로그래머스] 프렌즈4블록 - 자바스크립트
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바