본문 바로가기
자바 알고리즘

백준 9012번: 괄호 - StringBuilder 잘 활용하기(cf. sb.deleteCharAt(i))

by watergrace2u 2024. 11. 17.
반응형
SMALL

https://www.acmicpc.net/problem/9012

### 😊 잘한 점
- () 패턴을 치환하여 문자열에서 차례대로 없애야겠다는 아이디어를 떠올린건 좋다.

### 😢 부족한 점
- 처음에는 문자열의 replace 함수를 써야겠다는 생각을 했다. 하지만 replace(")","") 이런식으로 사용하는건 해당 문자열에서 ")" 를 모두 지우는 코드다. 이렇게 하면 안된다.
- 문자열을 동적으로 활용할 때는 **StringBuilder** 를 사용하자! 저번부터 느꼈지만, 문자열을 다룰 때는 웬만하면 StringBuilder 를 사용하는게 좋다. 상당히 많은 메서드를 제공하기 때문이다.
- 여기서는 **sb.deleteCharAt(i)** 함수를 사용하였다.(치환이 아닌 '삭제' 기능을 이용!)
- 또 한 가지 내가 간과했던 부분은 deleteCharAt(i)를 하면, 지운 지점으로부터 **문자의 인덱스가 하나씩 줄어든다는 부분이다.**
```java
sb.deleteCharAt(i);
// sb.deleteCharAt(i+1);
sb.deleteCharAt(i);
```
- 너무 당연한 말이다. 내가 의도하려던 것은 기존 문자열의 i와 i+1번째 문자를 지우려던 것이었으므로, sb.deleteCharAt(i) 을 두 번 사용해야한다.
- 또한, 테스트 케이스가 끝날 때마다 sb를 초기화해주는 것도 잊지 말자.
- i도 문자열에서 삭제 작업을 끝날 때마다 다시 0으로 초기화하여 계속해서 문자열의 처음부터 확인해야한다.

## 풀이
```java

import java.io.*;

class Main {

public static void main(String [] args) throws Exception {
// 괄호의 갯수가 같으면 무조건 짝이 맞을까? => 아님

// () 를 찾아서 ""로 치환해서 없애자.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());

int cnt = 0; // vps 패턴을 찾은 횟수
String answer = "";

while(T-->0) {
StringBuilder sb = new StringBuilder();
String s= br.readLine();
sb.append(s);
String vps = "()";

// 우선 계속 돌아보자. 언제까지? sb의 길이가 1이 될 때까지.
int i=0;
while(sb.length()>1 && i < sb.length()-1) {
String tmp = sb.charAt(i) +""+ sb.charAt(i+1);
if(tmp.equals(vps)) {
cnt++;
sb.deleteCharAt(i);  // 삭제하면 하나가 줄어들었으니
sb.deleteCharAt(i);
// 치환해서 끝나면 sb의 처음부터 다시 확인하기
i = 0;
}else {
// 몾찾으면 계속 검색하기
i++;
}
}
if(cnt==0) {
answer = "NO";
}
if(sb.length()>0) {
answer = "NO";
}else {
answer = "YES";
}
System.out.println(answer);
}
}
}
```

반응형
LIST

'자바 알고리즘' 카테고리의 다른 글

21. 아나그램(해쉬)  (0) 2022.09.13
20. 학급회장 (HashMap)  (0) 2022.09.12
19. 연속된 자연수의 합 (수학)  (0) 2022.08.10
18. 연속된 자연수의 합  (0) 2022.08.09
17. 연속 부분 수열 (sliding window + 복합)  (0) 2022.08.08

댓글