개발(0)/CodingTest
[프로그래머스/Level2]수식최대화 - 자바
까만밀가루
2024. 5. 6. 20:26
https://school.programmers.co.kr/learn/courses/30/lessons/67257
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 고려 조건]
- 조합의 수가 적기 때문에 수열이 아닌 직접 조합을 이용 → 수식 조합
- 주어진 expression 문자열 → 문자 list에 담기
- 수식 조합의 for문을 돌면서 list 돌기 : 수식의 우선 순위로 계산
이 때, 절대값과 큰 값을 비교한다. - 추가 method : 수식은 문자열이기 때문에 각각의 수식에 대한 계산 정의
[문제 풀이]
1.전체 가능한 수에 대한 수식을 조합한다.
String op[][] = {{"+", "-", "*"}, {"+", "*", "-"}, {"-", "+", "*"},
{"-", "*", "+"}, {"*", "-", "+"}, {"*", "+", "-"}};
2.주어진 expression에 대해 list로 담는다. 이때 마지막 숫자로 담을 수 있게 마지막 list.add 잊지 말자(나의 실패 이유1)
이때 수식을 기준으로 담는 이유는 "100-200"일때 1,0,0,-,2,0,0 이런식으로 되기 때문에
즉, 코드 자체로는 이게 숫자인지 수식인지 구분을 못하기 때문
ArrayList<String> list = new ArrayList<String>();
int start = 0;
for (int i = 0; i < expression.length(); i++) {
if (expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*') {
list.add(expression.substring(start, i));
list.add(expression.charAt(i) + ""); //String으로 변경
start = i + 1;
}
}
list.add(expression.substring(start));
3.for문을 돌 때 우선 순위로 계산 된 것은 제거 해야하기 때문에 remove한다.
예를 들어, "100-200*6+100" 인 상황에서 *가 우선 순위라면
k = 3 중심으로 k=2,3,4가 계산되고 그 계산 값은 k=2가 되고 k=3,4를 remove해야 "100-1200+100" 이런식으로 줄어든 수식에 대한 배열을 정의할 수 있다.(ArrayList를 쓴 이유)
for (int i = 0; i < op.length; i++) {
ArrayList<String> sub_list = new ArrayList<String>(list);
for (int j = 0; j < 3; j++) {
for (int k = 0; k < sub_list.size(); k++) {
if (op[i][j].equals(sub_list.get(k))) {
sub_list.set(k - 1, calculate(sub_list.get(k - 1), sub_list.get(k), sub_list.get(k + 1)));
sub_list.remove(k);
sub_list.remove(k);
k--;
}
}
}
answer = Math.max(answer, Math.abs(Long.parseLong(sub_list.get(0))));
}
[최종 코드]
import java.util.ArrayList;
class Solution {
public long solution(String expression) {
long answer = 0;
String op[][] = {{"+","-","*"},{"+","*","-"},{"-","+","*"},{"-","*","+"},{"*","-","+"},{"*","+","-"}};
ArrayList<String> list = new ArrayList<String>();
int start = 0;
for(int i=0;i<expression.length();i++){
if(expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*'){
list.add(expression.substring(start,i));
list.add(expression.charAt(i)+""); //String으로 변경
start = i+1;
}
}
list.add(expression.substring(start));
for(int i = 0 ; i<op.length;i++){
ArrayList<String> sub_list = new ArrayList<String>(list);
for(int j = 0; j<3;j++){
for (int k = 0; k < sub_list.size(); k++) {
if (op[i][j].equals(sub_list.get(k))) {
sub_list.set(k - 1, calculate(sub_list.get(k - 1), sub_list.get(k), sub_list.get(k + 1)));
sub_list.remove(k);
sub_list.remove(k);
k--;
}
}
}
answer = Math.max(answer, Math.abs(Long.parseLong(sub_list.get(0))));
}
return answer;
}
public String calculate(String num1, String oper, String num2){
long n1 = Long.parseLong(num1);
long n2 = Long.parseLong(num2);
if(oper.equals("+")){
return n1 + n2 + "";
}else if(oper.equals("-")){
return n1 - n2 + "";
}else{
return n1 * n2 + "";
}
}
}