문자열 계산식을 입력받는 계산기를 만들려고 합니다. 계산식은 덧셈(+), 뺄셈(-), 숫자로만 이루어져 있습니다.
계산식 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합니다.