programmers_[카카오 인턴] 수식 최대화_java
2023. 5. 2. 18:01ㆍAlgorithm/Programmers
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/67257
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import java.util.*;
class Solution {
private long max;
public long solution(String expression) {
long answer = 0;
// 수식 분리
String[] opers = expression.split("[0-9]+");
String[] nums = expression.split("[^0-9]");
List<Long> numList = new ArrayList<>();
List<String> operList = new ArrayList<>();
for(String o : nums){
numList.add(Long.parseLong(o));
}
for (int i = 1; i< opers.length; i++){
operList.add(opers[i]);
}
// 연산자 목록
String[] operMenu = {"*", "+", "-"};
Map<Integer, String> operMap = new HashMap<>();
setOperOrder(numList, operList, operMenu, operMap, 1, new boolean[operMenu.length]);
answer = max;
return answer;
}
public void setOperOrder(List<Long> nums,List<String> opers, String[] operList, Map<Integer, String> operMap, int cnt, boolean[] visited){
int operListLength = operList.length;
if(operListLength < cnt){
max = Math.max(max, Math.abs(cal(cloneLongList(nums), cloneStringList(opers), operMap)));
return;
}
for(int i = 0; i< operListLength; i++){
if(!visited[i]){
visited[i] = true;
operMap.put(cnt, operList[i]);
setOperOrder(nums, opers, operList, operMap, cnt+1, visited);
visited[i] = false;
}
}
}
public long cal(List<Long> nums,List<String> opers, Map<Integer, String> operMap){
long res = 0;
int idx = 0;
while (!opers.isEmpty()){
if(opers.indexOf(operMap.get(1)) != -1){ // 1순위
idx = opers.indexOf(operMap.get(1));
} else if(opers.indexOf(operMap.get(2)) != -1){ // 2순위
idx = opers.indexOf(operMap.get(2));
} else if(opers.indexOf(operMap.get(3)) != -1){ // 3순위
idx = opers.indexOf(operMap.get(3));
}
if (idx == -1) { // 모든 연산자 사용
break;
}
long n1 = nums.remove(idx); // 연산자 앞 숫자
long n2 = nums.remove(idx); // 연산자 뒤 숫자
String oper = opers.remove(idx);
res = calculator(n1, n2, oper);
nums.add(idx, res);
}
return res;
}
public List<String> cloneStringList(List<String> original){
List<String> list = new ArrayList<>(original.size());
for (String s: original){
list.add(s);
}
return list;
}
public static List<Long> cloneLongList(List<Long> original){
List<Long> list = new ArrayList<>(original.size());
for (Long s: original){
list.add(s);
}
return list;
}
public long calculator(long n1, long n2, String oper){
switch (oper){
case "+":
return n1 + n2;
case "-":
return n1 - n2;
case "*":
return n1 * n2;
}
return -1;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
programmers_줄 서는 방법_java (0) | 2023.05.10 |
---|---|
programmers_전력망을 둘로 나누기_java (0) | 2023.05.09 |
programmers_연속된 부분 수열의 합_java (0) | 2023.04.28 |
programmers_[3차] 방금그곡_java (0) | 2023.04.26 |
programmers_행렬 테두리 회전하기_java (0) | 2023.04.22 |