Lv 2. 수식최대화

2024. 9. 1. 20:26·Algorithm & Data Structures/Programers

import java.util.*;

class Solution {
    public long solution(String expression) {
        long answer = 0;
        
        // 포함된 연산자를 추출하여 문자열로 만듦
        StringBuilder str = new StringBuilder();
        if(expression.contains("+")) str.append("+");
        if(expression.contains("-")) str.append("-");
        if(expression.contains("*")) str.append("*");
        
        // 연산자의 모든 우선순위 조합을 계산
        String[] combi = combination(str.toString());
        
        // 각 조합마다 계산을 수행하고 최대값을 찾음
        for(String st : combi){
            long ans = Math.abs(calculate(expression, st));
            if(answer < ans)
                answer = ans;
        }
        
        return answer;
    }
    
    // 순열을 반환하는 메서드
    public String[] combination(String s){
        ArrayList<String> arr = new ArrayList<>();
        permute(s,"",arr);
        return arr.toArray(new String[0]);    
    }
    
    // 순열을 생성하는 메서드
    private static void permute(String str, String prefix, List<String> result) {
        int n = str.length();
        if (n == 0) {
            result.add(prefix);
        } else {
            for (int i = 0; i < n; i++) {
                permute(str.substring(0, i) + str.substring(i + 1, n), prefix + str.charAt(i), result);
            }
        }
    }
    
    // 수식을 계산하는 메서드
    public static long calculate(String expression, String operators) {
        // 숫자와 연산자를 분리
        List<Long> numbers = new ArrayList<>();
        List<Character> ops = new ArrayList<>();
        
        int i = 0;
        StringBuilder number = new StringBuilder();
        
        while (i < expression.length()) {
            char c = expression.charAt(i);
            if (Character.isDigit(c)) {
                number.append(c);
            } else {
                numbers.add(Long.parseLong(number.toString()));
                number = new StringBuilder();
                ops.add(c);
            }
            i++;
        }
        numbers.add(Long.parseLong(number.toString())); // 마지막 숫자 추가
        
        // 연산자 우선순위에 따라 계산
        for (char operator : operators.toCharArray()) {
            int j = 0;
            while (j < ops.size()) {
                if (ops.get(j) == operator) {
                    // 두 숫자를 해당 연산자로 계산
                    long result = performOperation(numbers.remove(j), numbers.remove(j), operator);
                    numbers.add(j, result);  // 결과를 숫자 리스트에 다시 추가
                    ops.remove(j);  // 연산자를 제거
                } else {
                    j++;
                }
            }
        }
        
        // 최종 계산 결과 반환
        return numbers.get(0);
    }
    
    // 실제 연산을 수행하는 메서드
    private static long performOperation(long a, long b, char operator) {
        switch (operator) {
            case '+': return a + b;
            case '-': return a - b;
            case '*': return a * b;
            default: throw new IllegalArgumentException("Unknown operator: " + operator);
        }
    }
}

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 테이블 해시 함수  (0) 2024.09.03
Lv 2. 줄 서는 방법  (0) 2024.09.02
Lv 2. 미로탈출  (0) 2024.08.31
Lv 2. 괄호 변환  (0) 2024.08.28
Lv 2. 무인도 여행  (0) 2024.08.26
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 테이블 해시 함수
  • Lv 2. 줄 서는 방법
  • Lv 2. 미로탈출
  • Lv 2. 괄호 변환
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (316)
      • Algorithm & Data Structures (238)
        • BOJ (96)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    유니온파인드
    dfs
    구현
    Dijkstra
    후위순회
    투포인터
    unionfind
    동적계획법
    다익스트라
    백준
    BFS
    binarySearch
    전위순회
    Union-Find
    dp
    programmers
    Java
    스택
    Stack
    백트래킹
    이분탐색
    골드
    DynamicProgramming
    프로그래머스
    경로압축
    SQL
    algorithm
    PriorityQueue
    알고리즘
    baekjoon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 2. 수식최대화
상단으로

티스토리툴바