문제 내용은 입력으로 { } 두 글자로만 이루어진 문자열을 받되 문자를 반대 값에 해당하는 } 혹은 { 로 뒤집어서 모두 짝이 맞게 변경할 경우 최소 몇 번을 움직여야 하냐는 것이 되겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int formNumber = 1;
while (true) {
Stack<Character> stack = new Stack<>();
int closeCount = 0;
String s = br.readLine();
if (s.startsWith("-")) {
break;
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '{') {
stack.push('{');
} else {
if (!stack.empty()) {
stack.pop();
} else {
stack.push('{');
closeCount++;
}
}
}
int ans = closeCount + stack.size() / 2;
System.out.println(formNumber + ". " + ans);
formNumber++;
}
}
}
문제를 풀어보자면 Stack에 값을 저장하면서 진행하는데 {가 들어오면 Stack에 넣어주고 }가 들어오면 pop을 사용해서 빼되, {가 없는 상태에서 }가 들어오면 다른 변수에 값을 1씩 늘려주고, 대신 {를 넣어주자
이후 문자열의 값을 모두 처리했다면 1씩 증가시켰던 변수 + Stack.size() / 2; 를 양식에 맞게 출력해주면 끝인데, 1씩 증가시켰던 값은 pop 시키지 못했던 } 라서 바로 이해할 수 있겠지만
Stack.size() / 2를 하는 이유는 Stack 안에 {{{{ 이런 식으로 들어있기 때문에 절반만 돌려도 페어를 맞출 수 있기 때문이다.
Leave a Reply