console.log

[BOJ] 16637 괄호 추가하기 JAVA 본문

알고리즘/백준

[BOJ] 16637 괄호 추가하기 JAVA

foresight 2023. 10. 1. 17:01

https://www.acmicpc.net/problem/16637

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

 

메모리 : 12028 kb
실행시간 : 88 ms

 

문제분석

괄호 최대 개수를 찾고
부분집합 돌리면서 계산

 

걸린시간

2일 정도 .. (반례 찾기가 힘들었다)

 

풀이방법

1. 숫자 개수 : N /2 + 1 최대 괄호 개수 : 숫자 개수 / 2
2. 괄호 0개 ~ 숫자개수 /2 ----> 부분집합으로 모든 괄호 개수에 대해 최대값 구하기
3. 먼저 계산할 인덱스를 조합으로 저장
4. 원본 수식을 복사한 list에서 해당 인덱스 부분을 계산해서 저장
5. 복사한 list 왼쪽부터 계산

3 ~ 5를 괄호 개수마다 반복하며 최대값 저장

 

포인트

인덱스 조합을 만들 때 간격을 잘 줘야 한다

 

코드

package study.day0818;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BOJ_16637_괄호추가하기2 {	// 메모리 : 12028 kb	실행시간 : 88 ms
	static List<String> list, list2;
	static int maxNum = Integer.MIN_VALUE;
	static int[] num;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		list = new ArrayList<>();
		int N = Integer.parseInt(br.readLine());
		int n = N / 2 + 1;	// 숫자 개수
		String[] temp = br.readLine().split("");		
		for (int i = 0; i < N; i++) {
			list.add(temp[i]);
		}
		for (int i = 0; i <= (n / 2); i++) {	// 괄호 개수만큼 부분집합
			num = new int[i];
			bracket(0, 0);
		}
		System.out.println(maxNum);
	}
	private static void bracket(int r, int start) {
		if(r == num.length) {
			list2 = new ArrayList<>(list);
			int n;
			for (int j = 0; j < num.length; j++) {
				switch (list2.get(num[j] + 1)) {
				case "*":
					n = Integer.parseInt(list2.get(num[j])) * Integer.parseInt(list2.get(num[j] + 2));
					for (int i = 0; i < 3; i++) {					
						list2.remove(num[j]);
					}
					list2.add(num[j], Integer.toString(n));
					break;
				case "+":
					n = Integer.parseInt(list2.get(num[j])) + Integer.parseInt(list2.get(num[j] + 2));
					for (int i = 0; i < 3; i++) {					
						list2.remove(num[j]);
					}
					list2.add(num[j], Integer.toString(n));
					break;
				case "-":
					n = Integer.parseInt(list2.get(num[j])) - Integer.parseInt(list2.get(num[j] + 2));
					for (int i = 0; i < 3; i++) {					
						list2.remove(num[j]);
					}
					list2.add(num[j], Integer.toString(n));
					break;
				}
			}
			Calculation();
			return;
		}
		if(start >= list.size() - (2 * num.length)) return;
		num[r] = start;
		bracket(r + 1, start + 2);
		bracket(r, start + 2);
	}
	private static void Calculation() {	// 최종 수식 계산 결과가 최대값일 때만 저장
		int n;
		while(list2.size() >= 3) {
			switch (list2.get(1)) {
			case "*":
				n = Integer.parseInt(list2.get(0)) * Integer.parseInt(list2.get(2));
				for (int i = 0; i < 3; i++) {					
					list2.remove(0);
				}
				list2.add(0, Integer.toString(n));
				break;
			case "+":
				n = Integer.parseInt(list2.get(0)) + Integer.parseInt(list2.get(2));
				for (int i = 0; i < 3; i++) {					
					list2.remove(0);
				}
				list2.add(0, Integer.toString(n));
				break;
			case "-":
				n = Integer.parseInt(list2.get(0)) - Integer.parseInt(list2.get(2));
				for (int i = 0; i < 3; i++) {					
					list2.remove(0);
				}
				list2.add(0, Integer.toString(n));
				break;
			}
		}
		maxNum = Math.max(maxNum, Integer.parseInt(list2.get(0)));
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 17281 ⚾ JAVA  (0) 2023.10.03
[BOJ] 17070 파이프 옮기기 1 JAVA  (2) 2023.10.02
[BOJ] 14891 톱니바퀴 JAVA  (0) 2023.09.25
[BOJ] 1759 암호 만들기 JAVA  (0) 2023.09.24
[BOJ] 12904 A와 B JAVA  (0) 2023.09.19