프로그래머스 수식 최대화 (Java,자바)
이번에 풀어본 문제는
프로그래머스 수식 최대화 입니다.
📕 문제 링크
❗️코드
import java.util.*;
class Solution {
static boolean [] isVis;
static long maxVal = Integer.MIN_VALUE;
static ArrayList<Long> numbers;
static ArrayList<Character> opers;
public long solution(String expression) {
char [] opArr = {'+','-','*'};
opers = new ArrayList<>();
numbers = new ArrayList<>();
StringBuilder sb = new StringBuilder(expression);
for(int i = 0; i < sb.length(); ++i)
{
char c = sb.charAt(i);
if(c == '+' || c == '-' || c == '*')
{
opers.add(c);
sb.setCharAt(i,' ');
}
}
String [] tmpNum = sb.toString().split(" ");
for(String s : tmpNum) numbers.add(Long.parseLong(s));
isVis = new boolean[3];
perm(opArr,"");
return maxVal;
}
static void perm(char [] arr, String curStr)
{
if(curStr.length() == 3)
{
calc(curStr);
return;
}
for(int i = 0; i < 3; ++i)
{
if(isVis[i]) continue;
isVis[i] = true;
perm(arr,curStr+arr[i]);
isVis[i] = false;
}
}
static void calc(String str)
{
ArrayList<Long> tmpAl = new ArrayList<>(numbers);
ArrayList<Character> tmpOP = new ArrayList<>(opers);
for(int i = 0; i < str.length(); ++i)
{
char op = str.charAt(i);
for(int j = 0; j < tmpOP.size(); ++j)
{
if(tmpOP.get(j) == op)
{
if(op == '+') tmpAl.set(j,tmpAl.get(j)+tmpAl.get(j+1));
else if(op == '-') tmpAl.set(j,tmpAl.get(j)-tmpAl.get(j+1));
else tmpAl.set(j,tmpAl.get(j)*tmpAl.get(j+1));
tmpAl.remove(j+1);
tmpOP.remove(j);
j -= 1;
}
}
}
maxVal = Math.max(maxVal,Math.abs(tmpAl.get(0)));
}
}
📝 풀이
import java.util.*;
class Solution {
static boolean [] isVis;
static long maxVal = Integer.MIN_VALUE;
static ArrayList<Long> numbers;
static ArrayList<Character> opers;
public long solution(String expression) {
char [] opArr = {'+','-','*'};
opers = new ArrayList<>();
numbers = new ArrayList<>();
StringBuilder sb = new StringBuilder(expression);
for(int i = 0; i < sb.length(); ++i)
{
char c = sb.charAt(i);
if(c == '+' || c == '-' || c == '*')
{
opers.add(c);
sb.setCharAt(i,' ');
}
}
String [] tmpNum = sb.toString().split(" ");
for(String s : tmpNum) numbers.add(Long.parseLong(s));
isVis = new boolean[3];
perm(opArr,"");
return maxVal;
}
static void perm(char [] arr, String curStr)
{
if(curStr.length() == 3)
{
calc(curStr);
return;
}
for(int i = 0; i < 3; ++i)
{
if(isVis[i]) continue;
isVis[i] = true;
perm(arr,curStr+arr[i]);
isVis[i] = false;
}
}
static void calc(String str)
{
ArrayList<Long> tmpAl = new ArrayList<>(numbers);
ArrayList<Character> tmpOP = new ArrayList<>(opers);
for(int i = 0; i < str.length(); ++i)
{
char op = str.charAt(i);
for(int j = 0; j < tmpOP.size(); ++j)
{
if(tmpOP.get(j) == op)
{
if(op == '+') tmpAl.set(j,tmpAl.get(j)+tmpAl.get(j+1));
else if(op == '-') tmpAl.set(j,tmpAl.get(j)-tmpAl.get(j+1));
else tmpAl.set(j,tmpAl.get(j)*tmpAl.get(j+1));
tmpAl.remove(j+1);
tmpOP.remove(j);
j -= 1;
}
}
}
maxVal = Math.max(maxVal,Math.abs(tmpAl.get(0)));
}
}
📝 풀이
경우의 수가 최대 6가지라서 완전탐색으로 풀었습니다.
먼저 연산자들을 탐색하여 ArrayList에 담아주고, 해당 연산자의 위치를 공백으로 바꿔둡니다. 연산자를 모두 담았다면 공백을 기준으로 문자열을 분리해주면, 연산자와 피연산자를 분리해줄 수 있습니다.
이후에는 순열 알고리즘을 통해 생성된 우선순위를 calc()로 전달하여 계산을 진행해줍니다. 각 경우마다 나온 결과값을 최대값으로 갱신해주고, maxVal을 출력해주면 완료됩니다.
📜 후기
문자열 분리를 깔끔하게 하고싶어서 고민하다보니 꽤 오래걸렸습니다.
결국 고민만 하고 구현을 못해서.. 조금 찝찝하지만 시간이 생명인 테스트인만큼 다음엔 욕심을 버려야겠어요ㅠ
Author And Source
이 문제에 관하여(프로그래머스 수식 최대화 (Java,자바)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jh5253/프로그래머스-수식-최대화-Java자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)