CodingTest/Programmers

[Programmers] 수식 최대화

창브로 2025. 5. 20. 21:31

[문제 링크]

https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[코드]

import java.util.*;

class Solution {
    public long solution(String expression) {
        long answer = 0;
        
        // 모든 경우의 수
        String[][] mix = new String[][] {
            {"+", "-", "*"},
            {"+", "*", "-"},
            {"-", "*", "+"},
            {"-", "+", "*"},
            {"*", "-", "+"},
            {"*", "+", "-"}
        };
    
        // 수와 식을 분리
        StringBuilder sb = new StringBuilder();
        List<String> strList = new ArrayList<>();
        
        char[] cArr = expression.toCharArray();
        
        for(char c : cArr) {
            if(Character.isDigit(c)) {
                sb.append(c);
            } else {
                strList.add(sb.toString());
                sb = new StringBuilder();
                strList.add(Character.toString(c));
            }
        }
        
        strList.add(sb.toString());
       
       
        // +,-,* 모든 우선순위 탐색 우선순위
        for(String[] m : mix) {
            // 복제 (다른 우선순위로도 해야 하니까 원본 훼손 X)
            List<String> tmp = new ArrayList<>(strList);
            
            // 우선순위로 하나하나 계산
            for(int i = 0; i < 3; i++) {
                String value = m[i];
                
                for(int j = 0; j < tmp.size();) {
                    
                    if(tmp.get(j).equals(value)) {
                        long a = Long.parseLong(tmp.get(j-1));
                        long b = Long.parseLong(tmp.get(j+1));
                        long c = 0;
                        
                        if(value.equals("+")) {
                            c = a+b;
                        }
                        
                        if(value.equals("-")) {
                            c = a-b;
                        }
                        
                        if(value.equals("*")) {
                            c = a*b;
                        }
                        
                        // 3개 지움(지우면 자동으로 앞으로 한칸 땡기기 때문에 같은 idx 지워야함)
                        tmp.remove(j-1);
                        tmp.remove(j-1);
                        tmp.remove(j-1);
                        
                        // 계산 값 저장
                        tmp.add(j-1, String.valueOf(c));
                        
                        // 처음부터
                        j = 0;
                    } else {
                        j++;
                    }
                    
                }
            }
            
            // abs 함수 통해서 절대값 적용
            long result = Math.abs(Long.parseLong(tmp.get(0)));
            
            // 가장 큰 값을 구해야 하기 때문에 answer에 미리 저장해놓은 result값과 비교
            answer = Math.max(answer, result);
        }
        
        return answer;
    }
}

[회고]

문제 자체는 쉬운데 막상 구현하려고 하니까 너무 어려웠습니다.

모든 경우의 수를 구하고 모든 걸 검색하려고 했지만 구현을 하지 못해 풀지 못했고

풀이 과정을 보며 스스로 풀어보았습니다.

 

Character.isDigit('값') -> 값이 숫자면 True 아니면 False

 

 

 

질문과 피드백은 언제나 환영입니다.

감사합니다.