🌞Algorithm/🔥Baekjoon

[Baekjoon] 16654_Generalized German Quotation

뿌야._. 2025. 8. 22. 10:22
문제(출처: https://www.acmicpc.net/problem/16654)

< Generalized German Quotation >

 

문제 풀이 

 

입력 문자열 시작이 '>>' 이거나 '<<'이더라도 무조건 '['로 바꾼다. 시작을 기준으로 하여 뒤를 '[' 또는 ']'로 바꾼다.

<<>><<<<>>>>

 

입력이 위와 같다면 시작인 '<<'을 '['로 바꾼다. 이것을 기준으로 바꾸면 다음처럼 된다.

<< >> << << >> >>
[     ]     [    [    ]    ]

 

 

my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Stack;

public class _16654_ { // Generalized German Quotation

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		String str = bf.readLine();

		ArrayList<Character> list = new ArrayList<>();
		Stack<Character[]> stack = new Stack<>();

		for (int i = 0; i < str.length(); i += 2) {
			if (stack.isEmpty()) {
				stack.add(new Character[] { str.charAt(i), '[' });
				list.add('[');
			} else {
				if (stack.peek()[0] == str.charAt(i)) {
					stack.add(new Character[] { str.charAt(i), stack.peek()[1] });
					list.add(stack.peek()[1]);
				} else {
					stack.pop();
					list.add(']');
				}
			}
		}

		if (stack.isEmpty()) {
			for (int i = 0; i < list.size(); i++) {
				bw.write(list.get(i));
			}
		} else {
			bw.write("Keine Loesung");
		}
		bw.flush();
	}
}
변수)
list : 복원한 문자열
stack : 올바른 따옴표인지 확인하기 위한 Stack

 

문자열을 입력받는다. 문자열을 탐색하면서 다음 과정을 거친다.

 

1) stack이 비어있다면 새로운 괄호가 시작되는 것이므로 stack에 [문자, '[' ] 저장 및 ArrayList에도 '[' 저장

2) stack이 비어있지 않다면 stack의 peek 값과 일치하는 문자인지 확인 

2-1) 일치하다면 앞과 같은 괄호가 저장되어야 함

2-2) 일치하지 않다면 닫는 괄호이므로 stack pop 및 list에 ']' 저장

 

최종 stack이 비어있다면 ArrayList를 출력하고, 비어있지 않다면 올바른 따옴표가 아니므로 "Keine Loesung"을 출력한다.