일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 메모리
- 네트워크
- 자바스크립트
- BFS
- 해시
- 프로젝트캠프
- 스레드
- 프로그래머스
- IT개발캠프
- ip
- 인사이드아웃
- CS
- Algorithm
- react-query
- 스나이퍼팩토리
- 타입스크립트
- react
- 프로세스
- 유데미
- App Runner
- javascript
- React.js
- 웅진씽크빅
- cs #네트워크
- 개발자부트캠프
- 알고리즘
- 리액트
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- typescript
- html
- Today
- Total
Bin's Blog
[프로그래머스] Level2 - 수식 최대화(Javascript) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▶ 문제 요약
1. 모든 참가자들에게는 숫자들과 3가지의 연산문자(+, -, *)만으로 이루어진 연산 수식이 전달되고 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출해라.
2. 연산자의 우선순위 정할 때 같은 순위의 연산자는 없어야한다. 6개의 조합을 가지고 계산하라.
3. 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가를 우승자로 선정한다.
▶ 정답 코드
// 숫자 연산 함수
function calculation(num1, num2, operation) {
switch(operation){
// +이면 두 값을 더하기
case "+":
return num1 + num2;
// -이면 두 값을 빼기
case "-":
return num1 - num2;
// *이면 두 값을 곱하기
case "*":
return num1 * num2;
}
}
function solution(expression) {
let answer = 0;
// 우선순위 조합
const operation = [
["*", "+", "-"],
["*", "-", "+"],
["+", "-", "*"],
["+", "*", "-"],
["-", "+", "*"],
["-", "*", "+"],
]
// 주어진 연산의 조합을 돈다.
for (let ops of operation) {
// 괄호를 빼면 split의 경우에는 비문자는 배열에 포함되지 않는다.
let regex = /(\D)/;
// 주어진 입력값을 숫자와 연산자로 나눈다.
let tempExpression = expression.split(regex);
// 숫자는 지금 형태가 문자열이니 숫자로 바꿔준다.
tempExpression = tempExpression.map(value
=> regex.test(value) ? value : Number(value));
// 배열을 한 번 더 들어가서 연산을 써보자.
for (let op of ops) {
// 입력값에서 연산이 있을때까지 돌아준다.
while(tempExpression.includes(op)) {
// 연산자가 있는 인덱스를 찾아준다.
let index = tempExpression.indexOf(op);
// 이제 계산을 시작한다.
let calculated =
calculation(tempExpression[index-1],
tempExpression[index+1], op);
// 그리고 입력값에서 계산된 값은 삭제해주고
// 그 자리에 계산 값 삽입.
tempExpression.splice(index-1, 3,
calculated);
}
}
// 이제 최댓값을 찾아준다.
answer = Math.max(answer,
Math.abs(tempExpression));
}
return answer;
}
▶ 풀이 과정
1. 먼저 모든 우선순위 조합 6가지를 배열에 담아준다.
2. 주어진 연산의 조합을 돌아준다.
3. 주어진 입력값이 숫자랑 연산이랑 붙어있으므로 정규표현식을 사용해서 분리한다. 여기서 (\D)는 숫자를 제외한 값들을 의미한다. 연산에 해당
4. 나중에 숫자 계산을 위해서 문자열인 숫자를 숫자형태로 변환시켜주기 위해서 map()함수를 사용했다. 정규표현식의 test()메서드를 활용해서 숫자가 아닌 형태인지 체크해서 숫자가 아닌 형태는 그대로 냅두고 숫자형태이면 숫자형으로 변환해준다.
5. 처음 operation 배열은 두겹으로 되어있다. 그래서 한 번 더 풀어야한다. 그래서 for문 한 번 더 돌면 비로소 배열 안에 요소에 접근할 수 있다. 그리고 includes() 메서드를 사용해서 주어진 입력값에 연산자가 있을 때까지 돌아준다.
6. 연산자가 있는 인덱스를 찾기 위해서 indexOf()메서드를 사용한다.
7. 이제 계산을 해야한다. 먼저 맨 위에 있는 calculation 함수를 보면 세 개의 매개변수가 존재한다. 숫자 2개와 연산이 매개변수로 들어가게 되고 switch문을 활용해서 현재 연산자에 해당하는 케이스가 있는지 체크해주고 해당하면 연산을 진행한다. 함수에 매개변수에는 연산자의 인덱스를 기준으로 앞과 뒤에 값이 들어가야 하고 해당 연산자가 들어가야 한다.
8. 그 다음에 중요한 작업이 있다. while문을 나오려면 계산된 값은 배열에서 삭제해줘야 한다. 그래서 splice()메서드를 활용해서 시작 위치는 index -1 (시작값) 그리고 3은 (끝값) 이렇게 하는 이유는 우리가 삭제해야하는 부분은
예를 들어 [1, +, 3]이라면 3개의 원소를 삭제해야한다. index가 1이라면 index-1은 0이니까 시작 지점, 그리고 3은 splice()메서드의 특성에 따라서 3의 전 요소인 2까지 삭제한다. 그럼 3까지 삭제하니까 맞게 삭제되고 그 자리에 위에서 계산한 값을 대체한다.
9. 이제 최댓값을 찾아준다. Math.max() 함수를 사용해서 큰 값을 계속 갱신하고 문제에서 음수가 주어졌을 땐 절댓값을 활용하라고 했으니, Math.abs()를 활용해서 최종 값을 출력해줬다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] Level2 - 전력망을 둘로 나누기(Javascript) (0) | 2023.05.23 |
---|---|
[프로그래머스] Level2 - 행렬 테두리 회전하기(Javascript) (0) | 2023.05.19 |
[프로그래머스] Level2 - 방금그곡(Javascript) (0) | 2023.05.13 |
[프로그래머스] Level2 - 괄호 변환(Javascript) (0) | 2023.05.10 |
[프로그래머스] Level2 - 연속된 부분 수열의 합(Javascript) (0) | 2023.05.10 |