여는 괄호와 닫는 괄호로 이루어진 문자열을 올바르게 수정하는 문제이다.
이미 올바르게 열리고 닫히는 괄호들은 생략한다.
스택을 사용하여 작업을 수행한다.
아래 코드에서는 덱을 사용하였지만 스택을 사용하여도 무방하다.
이 작업을 통해 }}{{
와 같이 올바르지 못한 표현만 남게 된다.
Deque<Character> shorterString = new ArrayDeque<>();
for (char value : input.toCharArray()) {
switch (value) {
case '{' :
shorterString.addLast('{');
break;
case '}' :
if (!shorterString.isEmpty() && shorterString.peekLast() == '{') {
shorterString.pollLast();
}
else {
shorterString.addLast('}');
}
break;
}
}
위 작업 이후 남게 되는 문자열은 }{
, {{
, }}
으로 구성되어 있다.
}{
의 경우 2개 모두 수정해야 하며,
{{
, }}
의 경우 1개씩 수정해야 한다.
위 작업에서 사용한 덱 또는 스택을 문자열로 변환할 필요 없이 바로 작업을 수행할 수 있다.
2개씩 빼서 두 값이 다르다면 2개를, 같다면 1개를 결과값에 추가한다.
int changeCnt = 0;
while (!shorterString.isEmpty()) {
char a = shorterString.pollFirst();
char b = shorterString.pollFirst();
if (a == b) {
changeCnt++;
}
else {
changeCnt += 2;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
public class _4889 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for (int t=1; true; t++) {
String input = br.readLine();
if (input.startsWith("-")) {
break;
}
Deque<Character> shorterString = new ArrayDeque<>();
for (char value : input.toCharArray()) {
switch (value) {
case '{' :
shorterString.addLast('{');
break;
case '}' :
if (!shorterString.isEmpty() && shorterString.peekLast() == '{') {
shorterString.pollLast();
}
else {
shorterString.addLast('}');
}
break;
}
}
int changeCnt = 0;
while (!shorterString.isEmpty()) {
char a = shorterString.pollFirst();
char b = shorterString.pollFirst();
if (a == b) {
changeCnt++;
}
else {
changeCnt += 2;
}
}
sb.append(String.format("%d. %d\n", t, changeCnt));
}
System.out.print(sb);
}
}