https://school.programmers.co.kr/learn/courses/30/lessons/181865#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해당 문제는 아주 간단한 문제이다.
두가지 숫자의 합, 곱, 빼기를 구하면 되는 문제였다.
그렇기에 내 맘대로 몇가지 규칙을 더해봤다.
더한 규칙은 다음과 같다.
- 모든 사칙연산이 등장할 수 있다 ( +, -, * / )
- 사칙연산은 하나가 아닌 여러개가 등장할 수 있다. (예를 들어 '15 + 12 - 7 * 3 * 1' 이 들어오면 6을 리턴하도록 한다)
단순했던 문제가 새로운 규칙을 더하자마자 조금 머리가 아파졌다.
필자가 생각한 풀이방법은 다음과 같다.
- 연산자를 위한 배열과 피연산자를 위한 배열 두가지를 준비
- 곱하기와 나누기 연산을 우선적으로 처리하여 피연산자 배열에 추가
- 최종적인 정답을 담기위한 배열을 하나 선언
- 만약 정답 배열이 비어있을 경우(아직 더하기 빼기 연산이 이루어지지 않은 경우), 피연산자에서 두개를 shift(), 연산자 배열에서 하나를 shift(), 반대 경우는 정답 배열에서 shift한것과 피연산자에서 shift한 값을 계산. (pop이 아닌 shift를 하는 이유는 먼저 들어온 값을 처리해주기 위해서)
- 앞서 언급한 행위를 연산할 값이 없을때까지 반복
- 성공적으로 연산이 이루어졌다면 정답 배열의 첫번째 인덱스에 정답이 존재
아래는 필자가 작성한 코드이다
function solution(binomial) {
let arr = binomial.split(" ");
let operator = [];
let operand = [];
let answer = [];
for (let i = 0; i < arr.length; i++) {
if (isNaN(Number(arr[i]))) {
if (arr[i] === "/") {
let a = operand.pop();
let b = arr[i + 1];
operand.push(Math.floor(a / b));
i += 1;
continue;
} else if (arr[i] === "*") {
let a = operand.pop();
let b = arr[i + 1];
operand.push(a * b);
i += 1;
continue;
} else {
operator.push(arr[i]);
}
} else {
operand.push(arr[i]);
}
}
if (operator.length === 0) {
return operand[0];
}
while (operator.length > 0 && operand.length > 0) {
if (answer.length === 0) {
let a = Number(operand.shift());
let b = Number(operand.shift());
let op = operator.shift();
if (op === "+") {
answer.push(a + b);
} else {
answer.push(a - b);
}
} else {
let a = answer.shift();
let b = Number(operand.shift());
let op = operator.shift();
if (op === "+") {
answer.push(a + b);
} else {
answer.push(a - b);
}
}
}
return answer[0];
}
let ex1 = "15 + 12 - 7 * 3 * 1";
let ex2 = "10 + 2 * 3 - 5 / 1";
let ex3 = "25 / 5 + 3 * 2 - 4";
let ex4 = "5 * 6 - 10 + 8 / 4";
let ex5 = "40000 * 40000";
let ex6 = "0 - 7777";
let ex7 = "43 + 12";
'알고리즘' 카테고리의 다른 글
[알고리즘] 유클리드 거리 & 맨해튼 거리 (0) | 2024.06.03 |
---|---|
[알고리즘] 정렬 (개선 ver) (0) | 2024.05.21 |
[알고리즘] 우선순위 큐 구현 (더 맵게) (0) | 2024.05.17 |
[알고리즘] 정렬 (0) | 2024.05.16 |
[알고리즘] 유클리드 호제법 (0) | 2024.05.05 |