https://www.acmicpc.net/problem/16637
16637번: 괄호 추가하기
첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가
www.acmicpc.net
코드설명
DFS를 활용하여 연산자를 고려하여 완전탐색을 진행하는 문제입니다.
문제에서 헷갈리는점은,
(A + B) + C는 어떻게 계산하는가가 헷갈리는데,
A + B 는 괄호가 없는경우 항상 먼저 시작하기에, 해당 사항은 이후의 괄호 처리시 자동으로 계산되는 로직입니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int N; public static ArrayList<Integer> num = new ArrayList<>(); public static ArrayList<Character> operand = new ArrayList<>(); public static int answer = Integer.MIN_VALUE; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); String str = br.readLine(); for(int i=0;i<N;i++) { if(i%2 == 0) { // 짝수라면 (문자 숫자를 숫자로 변환하기 위해 - '0' 처리) num.add(str.charAt(i) - '0'); }else if(i%2 == 1) { // 홀수라면 operand.add(str.charAt(i)); } } simulate(num.get(0), 0); System.out.println(answer); } //현재 인덱스, 합 public static void simulate(int sum, int operandIdx) { if(operandIdx >= operand.size()) { answer = Math.max(answer, sum); return ; } //괄호 없는경우 A + B int rs1 = calculate(operand.get(operandIdx), sum, num.get(operandIdx + 1)); simulate(rs1, operandIdx + 1); //괄호 있는경우 ( 옆의 연산결과에 괄호를 붙이는것 ) A + (B + C) if(operandIdx + 1 < operand.size()) { int rs2 = calculate(operand.get(operandIdx + 1), num.get(operandIdx + 1), num.get(operandIdx + 2)); int rs3 = calculate(operand.get(operandIdx), sum, rs2); simulate(rs3, operandIdx + 2); } } public static int calculate(char operand, int a, int b) { switch(operand) { case '+': return a + b; case '-': return a - b; case '*': return a * b; } return 999; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1789 수들의 합 - 수학 JAVA (0) | 2023.07.19 |
---|---|
[백준] 14391 종이 조각 - 완전탐색(BruteForce) + DFS(깊이우선탐색) JAVA (0) | 2023.07.18 |
[백준] 21278 호석이 두 마리 치킨 - DFS(조합) + BFS JAVA (0) | 2023.07.17 |
[백준] 1025 제곱수 찾기 - 완전탐색 + 아이디어 JAVA (0) | 2023.07.17 |
[백준] 12919 A와 B 2 - 완전탐색 (DFS) + 문자열 JAVA (0) | 2023.07.16 |