diff --git "a/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/Main.java" "b/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/Main.java" new file mode 100644 index 0000000..e74dfdf --- /dev/null +++ "b/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/Main.java" @@ -0,0 +1,46 @@ +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 index = 1; + while (true) { + String line = br.readLine(); + if (line.charAt(0) == '-') break; // 종료 조건 + + int res = 0; + Stack stack = new Stack<>(); + + // 문자열의 모든 문자 처리 + for (char c : line.toCharArray()) { + + if (c == '{') { + // 여는 괄호는 push + stack.push(c); + } else { + // 닫는 괄호가 등장한 경우 + if (stack.isEmpty()) { + // 앞에 매칭될 '{' 가 없으면 '}' → '{' 로 변경 (연산 +1) + res++; + stack.push('{'); + } else { + // 정상적인 매칭이므로 pop + stack.pop(); + } + } + } + + // 처리 후 스택에는 '{'만 남아 있음 + // "{{" → "{ }" 로 바꾸는 데 1회 필요 → size / 2 + res += stack.size() / 2; + + // 결과 출력 + System.out.printf("%d. %d\n", index++, res); + } + } +} diff --git "a/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/README.md" "b/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/README.md" new file mode 100644 index 0000000..5736ace --- /dev/null +++ "b/Essential/4889_\354\225\210\354\240\225\354\240\201\354\235\270_\353\254\270\354\236\220\354\227\264/README.md" @@ -0,0 +1,62 @@ +# 안정적인 문자열 (BOJ 4889) + +주어진 문자열은 `{` 와 `}` 로 구성되어 있으며, 이를 **안정적인 문자열**로 만들기 위해 필요한 최소 연산 횟수를 계산하는 문제이다. +문자열이 `-` 로 시작하면 입력이 종료된다. + +--- + +## 문제 개요 + +안정적인 문자열이란 다음 조건을 만족한다. + +1. `{` 와 `}` 로만 이루어져 있다. +2. 모든 `{` 는 올바르게 매칭되는 `}` 를 가져야 한다. + +문자열을 안정적으로 만들기 위해 다음 연산을 사용할 수 있다. + +* `{` → `}` +* `}` → `{` + +이 두 연산 중 필요한 최소 횟수를 계산한다. + +--- + +## 💡 해결 방법 + +스택을 사용하여 문자열을 왼쪽부터 순서대로 처리한다. + +### 1. 문자 처리 규칙 + +* `{` → 스택에 push +* `}` → + + * 스택이 비어 있으면: + → `}` 를 `{` 로 바꿔야 하므로 연산 +1 + → 바꾼 `{` 를 스택에 push + * 스택이 비어 있지 않으면: + → 정상 매칭이므로 pop + +### 2. 처리 후 스택 분석 + +모든 문자를 처리한 후 스택에는 **매칭되지 않은 `{`** 들만 남는다. + +예: `"{{{{"` → 4개 남음 + +두 개씩 짝지어 `"{{"` → `"{ }"` 로 바꾸는 데 1회 필요하므로, + +``` +남은 수 / 2 +``` + +만큼 연산을 더해준다. + +--- + +## 총 연산 횟수 + +``` +result = (닫는 괄호 보정 횟수) + (남은 여는 괄호 보정 횟수) +``` + +--- +