Algorithm/백준

괄호 제거

whyWhale 2023. 3. 9.

문제 설명

수식이 주어지는데, 괄호를 제거해서 나올 수 있는 경우를 모두 출력하는 문제이다.

  • 수식은 올바른 형태로만 입력이 들어온다.
  • 예를들어 (2+(22)+2)에서 괄호를 제거하면, (2+22+2), 2+(22)+2, 2+22+2를 만들 수 있다.
    • 하지만, (2+22)+2와 2+(22+2)는 만들 수 없다. (부적적한 수식이기 때문)

아이디어

괄호 쌍을 하나의 묶음으로 보고 조합을 이용한다.

조합에서 나온 경우의수가 한 묶음이므로 묵음에 있는 괄호 좌표를 출력할 것인지 안할 것인지 판단하고 정답 문자열에 넣어준다.

풀이

	static Set<List<Integer>> noPicks = new HashSet<>();
	static List<int[]> results;
	static String[] inputs;
	static TreeSet<String> answers;

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

		inputs = reader.readLine().split("");
		// 괄호 쌍 위치들(괄호 여는 위치, 괄호 닫는 위치)
		results = new ArrayList<>();
		Stack<Integer> s = new Stack<>();
		for (int i = 0; i < inputs.length; i++) {
			String input = inputs[i];
			if (input.equals("(")) {
				s.push(i);
			} else if (input.equals(")")) {
				if (!s.isEmpty()) {
					results.add(new int[] {s.pop(), i});
				}
			}
		}
		comb(0, 0, new ArrayList<>());

		answers = new TreeSet<>();
		for (List<Integer> noPick : noPicks) { // nopicks는 안뽑아야 하는 results 위치
			Set<Integer> set = noPick.stream().map(idx -> results.get(idx))
				.map(ints -> new Integer[] {ints[0], ints[1]})
				.flatMap(Arrays::stream)
				.collect(Collectors.toSet());

			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < inputs.length; i++) {
				if (set.contains(i)) {
					continue;
				}
				sb.append(inputs[i]);
			}

			if (sb.length() == inputs.length)
				continue;

			answers.add(sb.toString());
		}

		answers.forEach(System.out::println);
	}

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

중앙값 구하기  (0) 2023.03.11
데이터 체커  (0) 2023.03.09
백준 - 퇴사  (0) 2023.02.12
백준 - 치즈  (0) 2023.02.12
Strahler 순서  (0) 2022.11.15

댓글