Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions Essential/4889_안정적인_문자열/Main.java
Original file line number Diff line number Diff line change
@@ -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<Character> 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);
}
}
}
62 changes: 62 additions & 0 deletions Essential/4889_안정적인_문자열/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# 안정적인 문자열 (BOJ 4889)

주어진 문자열은 `{` 와 `}` 로 구성되어 있으며, 이를 **안정적인 문자열**로 만들기 위해 필요한 최소 연산 횟수를 계산하는 문제이다.
문자열이 `-` 로 시작하면 입력이 종료된다.

---

## 문제 개요

안정적인 문자열이란 다음 조건을 만족한다.

1. `{` 와 `}` 로만 이루어져 있다.
2. 모든 `{` 는 올바르게 매칭되는 `}` 를 가져야 한다.

문자열을 안정적으로 만들기 위해 다음 연산을 사용할 수 있다.

* `{` → `}`
* `}` → `{`

이 두 연산 중 필요한 최소 횟수를 계산한다.

---

## 💡 해결 방법

스택을 사용하여 문자열을 왼쪽부터 순서대로 처리한다.

### 1. 문자 처리 규칙

* `{` → 스택에 push
* `}` →

* 스택이 비어 있으면:
→ `}` 를 `{` 로 바꿔야 하므로 연산 +1
→ 바꾼 `{` 를 스택에 push
* 스택이 비어 있지 않으면:
→ 정상 매칭이므로 pop

### 2. 처리 후 스택 분석

모든 문자를 처리한 후 스택에는 **매칭되지 않은 `{`** 들만 남는다.

예: `"{{{{"` → 4개 남음

두 개씩 짝지어 `"{{"` → `"{ }"` 로 바꾸는 데 1회 필요하므로,

```
남은 수 / 2
```

만큼 연산을 더해준다.

---

## 총 연산 횟수

```
result = (닫는 괄호 보정 횟수) + (남은 여는 괄호 보정 횟수)
```

---