접근법
[+ , - , *] 3가지 연산의 우선순위를 정해 그에 맞게 계산을 한 다음, 그 값(절댓값) 중 가장 큰 값을 return하면 되는데
생각해야 될 문제는
- "100-200+300-500+20" 이렇게 연산이 문자열로 나와있어서 연산자와 숫자를 분리시켜야 함
- 연산자를 계산 후에 그 자리에 계산한 값을 넣어야함
- 연산자 종류가 무조건 3개라고 한 적은 없음 + 연산자가 중복으로 있을수도 있음
일단 문자열을 숫자와 연산자로 분리해서 배열로 바꿔줬고 연산자의 우선순위 경우의 수를 모두 구해서 반복문으로 하나씩 실행
- 배열에서 해당 연산자를 찾음(indexOf)
- 해당 연산자의 index-1 , index+1은 무조건 숫자이기 때문에 이 둘을 연산자 타입에 맞게 계산해줌
- [..., - , 200 , * , 300, + ,...]의 경우 200,*,300이 있는 부분을 그 계산값인 60000으로 바꿔줘야 그 다음 계산이 가능함
- 배열에서 연산이 완료된 부분을 그 값으로 바꾸기 위해서는 splice()를 사용하면 됨
- splice(시작idx,제거할 원소 갯수,대신 넣을 아이템) => splice(연산자 위치-1,3,계산값)
- 연산자가 중복으로 있을 경우도 있기 때문에 indexOf(연산자,직전에 찾은 연산자의 위치)를 통해 직전에 찾은 연산자 뒤의 원소에 똑같은 연산자가 있는지 확인해줌
코드
function solution(expression) {
const pattern = /(\d+|[-*+])/g
const arr = expression.match(pattern)
const operators = [[ '+', '-', '*' ],
[ '+', '*', '-' ],
[ '-', '+', '*' ],
[ '-', '*', '+' ],
[ '*', '+', '-' ],
[ '*', '-', '+' ]]
const calculate = (a,b,op) => {
switch(op){
case '*':
return a * b
break
case '+':
return a + b
break
case '-':
return a - b
break
}
}
const result = []
for(let operator of operators){
let copy = [...arr]
for(let op of operator){
let start = 0
while(copy.indexOf(op,start) > -1){
const idx = copy.indexOf(op)
const result = calculate(+copy[idx-1],+copy[idx+1],op)
copy.splice(idx-1,3,result)
start = idx
}
}
result.push(Math.abs(copy[0]))
}
return Math.max(...result)
}
'코딩테스트 연습' 카테고리의 다른 글
프로그래머스 - 거리두기 확인하기 (0) | 2023.08.03 |
---|---|
프로그래머스 - 귤 고르기 JS (0) | 2023.07.28 |
프로그래머스 - 입국심사 JS (0) | 2023.07.16 |
프로그래머스 - 부대복귀 JS (0) | 2023.06.26 |
백준 1411 - 비슷한 단어 JS (0) | 2023.06.16 |