문자열 계산기

rlorxl·2022년 5월 3일
0

문제

문자열 계산식을 입력받는 계산기를 만들려고 합니다. 계산식은 덧셈(+), 뺄셈(-), 숫자로만 이루어져 있습니다.
계산식 s가 주어질 때, 계산식의 계산 결과를 출력하는 함수, solution을 완성해주세요.

예를 들어, s가 -3+26-7로 주어질 때, 계산식의 계산 결과는 '16' (-3 + 26 -7)입니다.

제한 사항
계산식은 덧셈(+), 뺄셈(-), 숫자로만 이루어져 있습니다.
입력 형식
s는 길이가 1 이상 10 이하의 문자열입니다.
출력 형식
계산식의 계산 결과를 int 형식으로 출력합니다.


코드

function solution(s){
    const nums = []; // 숫자 저장공간
    const ops = []; // 문자 저장공간
    save(s, nums, ops);
    return calc(nums, ops);
}

function add(nums1, nums2){
  return nums1 + nums2;
}

function sub(nums1, nums2){
  return nums1 - nums2;
}

// 계산하기
function calc(nums, ops){
  if(nums.length === 1) return nums[0];

  const nums1 = nums.shift();
  const nums2 = nums.shift();

  const calcNum = (ops.shift() === '+') ? add(nums1, nums2) : sub(nums1, nums2);
  nums.unshift(calcNum);
  return calc(nums, ops);
}

// 숫자, 문자 배열 각각 저장
function save(s, nums, ops){
  let i = 0;
  let tmpNum = ''; 

  while(i < s.length){
    const c = s.charAt(i++); 

    if (isNumber(c)){ // 숫자인경우
      tmpNum += c; 
    } else { // 문자인경우
      if (i === 0){ 
        nums.push(0); 
        ops.push(c);
      } else {
        nums.push(Number(tmpNum)); // 이어붙인 숫자를 숫자배열에 저장하기
        ops.push(c);
      }
      tmpNum = ''; // 숫자 리셋
    }
  }

  nums.push(Number(tmpNum)); // 마지막 남은 숫자까지 저장하기
  // console.log(nums) -> [0, 3, 26, 7]
  // console.log(ops) -> ['-', '+', '-']
}

// 숫자 여부 판단
function isNumber(c) {
  const charCode = c.charCodeAt(0);
  return 48 <= charCode && charCode <= 57;
}

save()

  • 입력받은 문자열(s)에서 문자 하나하나를 변수 'c'로 설정합니다.
  • 10 단위 이상의 숫자를 저장하는 'tmpNum'을 선언합니다.(문자)
  • s의 길이만큼 i를 ++하며 동작을 수행합니다.
  • c가 숫자인 경우 tmpNum에 c를 더합니다.
    charCodeAt(): 주어진 인덱스 대한 문자에 대한 UTF-16 코드를 나타내는 정수를 반환한다. (아스키코드 48 ~ 57 => 숫자 0 ~ 9)
  • c가 문자인 경우 중 i가 0인 경우(가장 첫번째): c가 문자이면 음수('-')이므로 nums배열에는 '0'을 넣어 계산이 가능하도록 만듭니다. 문자 배열엔 그대로 'c'를 push.
  • c가 문자면서 첫번째가 아닌 경우: tmpNum에 저장되었던 숫자를 숫자배열에 저장하고 문자도 문자배열에 저장.
  • 마지막에 tmpNum을 비워준다.

calc()

  • 저장된 숫자 배열에서 두 개의 숫자를 꺼냅니다.(shift())
  • 문자 배열에서 하나를 꺼내서 계산을 합니다.
  • 숫자 배열에 계산된 수를 앞쪽에 다시 넣고(unshift()) 재귀함수를 실행시켜 계산이 계속 되도록 합니다.
  • 숫자 배열에 요소가 하나 남았을때는 그 수를 그대로 return합니다.
profile
즐겜하는거죠

0개의 댓글