📙 1. 문제
Link : https://school.programmers.co.kr/learn/courses/30/lessons/67257
문제 설명
풀이 1 : 내 풀이
풀이 과정
- expression은 문자열이므로 split을 이용하여 숫자를 분리하고, filter를 이용해 문자(연산자)를 분리한다.
- split(/*+-/g) : 정규표현식을 이용하여 *혹은 + 혹은 -을 기준으로 숫자를 분리한다.
- filter(it=>isNaN(it)) : 숫자가 아닌 것을 filter하여 *,+,-을 분리한다.
- 37번 째 줄의 forEach문 : +, -, *(연산자)중 무엇을 먼저 계산할 지 결정한다. [1,2,0]이라면-,*,+순으로 계산한다.
- calculate 함수 : 받은 연산자 리스트를 forEach를 이용하여 하나씩 실행한다
- calculateEach 함수 : 연산자 배열에서 현재 연산자에 해당하는 값을 찾아, 없다면(-1이라면) while문을 종료하고, 있다면 연산자 배열이라면 제거하고 numArr배열이라면 2개 값을 계산된 값으로 대체한다.
- exArr.indexOf(calculateNow) : 현재 연산자에 해당하는 값 찾기
- calculateIt 함수 : 2개의 숫자와 주어진 연산자로 계산을 수행하여 return한다.
function solution(expression) {
var answer = 0;
const calculateIt = (a,b,expression) => {
[a,b] = [+a,+b]
if(expression==='*') return a*b;
if(expression==='+') return a+b;
if(expression==='-') return a-b;
}
const calculateEach = (numArr,exArr,calculateNow) => {
let thisPos = exArr.indexOf(calculateNow);
while(thisPos!==-1){
const result = calculateIt(numArr[thisPos],numArr[thisPos+1],calculateNow)
exArr.splice(thisPos,1);
numArr.splice(thisPos,2,result);
thisPos = exArr.indexOf(calculateNow);
}
return numArr[0]
}
const express = ['+','-','*']
const calculate = (numArr,exArr, item) => {
item.forEach(it=>{
expression = calculateEach(numArr,exArr, express[it])
})
return expression
}
const cases = [
[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]
]
const numArr = expression.split(/[*+-]/g);
const exArr = expression.split('').filter(it=>isNaN(it))
cases.forEach(item=>{
const numArrDup = [...numArr];
const exArrDup = [...exArr]
const result = calculate(numArrDup,exArrDup,item)
answer = Math.max(answer,result>0?result:(-1)*result)
})
return answer;
}
풀이 2 : 다른 사람 풀이
풀이 과정
- for of문을 이용하여 연산자 우선순위 배열을 탐색한다.
- 연산자를 분리한다.
- expression.split(/(\D)/) : 정규표현식 - 숫자를 기준으로 분리
- for of문을 이용하여 연산자 우선순위 배열을 우선순위 별로 하나씩 탐색한다.
- for (let exp of opCand)
- 연산자 배열이 이 문자를 포함할 때까지 반복한다.
- while(temp.includes(exp))
- 문자를 포함한다면, 제외하고, 계산을 수행한다.
- temp.splice(idx-1,3,eval(temp.slice(idx-1,idx+2).join('')))
- eval : 문자열을 계산하는 메소드
function solution(expression) {
const prior = [
['-', '*', '+'],
['-', '+', '*'],
['*', '-', '+'],
['*', '+', '-'],
['+', '-', '*'],
['+', '*', '-']
];
let cand = [];
for (let opCand of prior) {
const temp = expression.split(/(\D)/);
for (let exp of opCand) {
while (temp.includes(exp)) {
const idx = temp.indexOf(exp)
temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join('')));
}
}
cand.push(Math.abs(temp[0]));
}
return Math.max(...cand);
}
🤔 2. 느낀 점
내가 처음에 알고리즘을 고민하고 코드를 작성할 때, '이게 맞을까?', '실수는 없을까?'하는 생각이 들었다. 그러나, 고민만 하지 않고 실제로 코드를 실행해보니, 나의 걱정은 허울이었다. 첫 시도에서는 간단한 에러들이 있었지만, undefined 오류나 함수명 중복 같은 문제를 해결하고 나니, 나의 코드는 문제를 순조롭게 해결하였다.
이전에는 이런 복잡하거나 긴 문제들을 보면 쉽게 포기했었지만, 이번에는 도전해보았다. 그 결과, 내가 기대했던 것 이상의 좋은 결과가 나왔다. 이 경험을 통해 배운 것은, 복잡하고 어려워 보이는 문제에도 두려워하지 않고 도전해보는 것의 중요성이다.
앞으로도 이렇게 보기에 복잡하고, 어려운 문제라도 도전의 자세를 가져보자. 문제를 해결하는 과정에서 생기는 작은 오류들은, 나의 코드를 더 완벽하게 만들어주는 계기가 될 것이다. 그리고 그 과정 속에서 나는 더욱 성장할 수 있을 것이다.
🤩 3. 한 번 더 짚고 갈 점
1. 정규표현식의 편리함과 소중함을 한 번 더 느낄 수 있었다. 정규표현식은 정말 복잡한 식을 간결한 식으로 바꿔주는 '마법'이다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 개인정보 수집 유효기간 (0) | 2023.06.19 |
---|---|
[프로그래머스] 표 병합 (0) | 2023.05.21 |
[프로그래머스] 코딩테스트 공부 (0) | 2023.05.20 |
[프로그래머스] 표현 가능한 이진트리 (1) | 2023.05.19 |
[프로그래머스] 거리두기 확인하기 (0) | 2023.05.14 |
[프로그래머스] 방금 그곡 (1) | 2023.05.13 |
[프로그래머스] 후보키 (0) | 2023.05.12 |
[프로그래머스] 문자열 압축 (0) | 2023.05.11 |