TIL-백준 9012번 문제 고찰
2024-04-24
오늘의 학습 🌠
고민한 문제 😏
- 백준 9012번 문제
해당 문제는 괄호 ‘(‘, ‘)’, 로만 이루어져있고 해당 괄호가 쌍으로 이루어져있으면 “YES”를 출력하고 쌍으로 이루어져있지 않았다면 “NO”를 출력하는 문제입니다.
이 문제는 아이템들이 쌍을 이뤄서 사라지게 하는 유형으로 테스트 케이스로 정수를 입력받고 여러 개의 테스트 케이스를 처리하는 문제입니다. 각 케이스마다 여는 괄호 “(“ 와 닫는 괄호 “)”가 올바르게 쌍을 이루는지 확인하는 것입니다.
따라서 해당 문제를 해결하기 위해 Stack 자료구조를 사용했습니다.
해결한 코드는 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
int T = Integer.parseInt(bf.readLine()); //테스트 케이스 입력
Stack<String> stack = new Stack<>(); //스택 선언 및 생성
String[] arr; //문자열 배열 선언
for(int i=0;i<T;i++) { //테스트 케이스만큼 반복
String s = bf.readLine(); //사용자로부터 문자열을 한 줄 입력받음
arr = s.split(""); //split을 이용하여 구분하여 배열에 저장
for(int j=0;j<arr.length;j++) { //배열의 길이만큼 반복
if(arr[j].equals("(")) //"(" 문자열이 입력됐을 경우
{
stack.push(arr[j]); //stack에 추가
}
else{ //다른 문자열이 입력됐을 경우
if(stack.isEmpty()) //stack이 비어있다면
{
stack.push(arr[j]); //입력한 문자열 stack에 추가
break; //탈출(종료)
}
else{ //stack에 값이 있다면
stack.pop(); //해당 문제를 stack에서 지움
}
}
}
if(stack.isEmpty()) //stack이 비었다면
{
System.out.println("YES"); //"YES" 출력
}
else{ //stack에 값이 있다면
System.out.println("NO"); //"NO" 출력
}
}
}
}
출력이 “NO”로만 나오게 되었습니다.
여러 테스트 케이스를 처리할 때 ‘Stack’ 객체를 재사용하고 있는데 한 테스트 케이스를 처리한 후 Stack에 남은 데이터가 다음 테스트 케이스에 영향을 주는 것입니다.
그래서 각 테스트 케이스를 처리할 때마다 Stack을 비워주는 것이 필요!
예를 들어 처음 (())()) 이렇게 입력이 되면 (()) 이렇게 짝이 맞고, () 이렇게 짝이 맞아 “)” 닫는 괄호 하나가 남겠죠? 이게 stack에 남아 다음 테스트 케이스에 영향을 주게 되는 것입니다.
따라서
stack.clear();
를 사용해서 각 테스트 케이스를 처리할 때마다 Stack을 비워주는 것이 해결 방안입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
int T = Integer.parseInt(bf.readLine()); //테스트 케이스 입력
Stack<String> stack = new Stack<>(); //스택 선언 및 생성
String[] arr; //문자열 배열 선언
for(int i=0;i<T;i++) { //테스트 케이스만큼 반복
String s = bf.readLine(); //사용자로부터 문자열을 한 줄 입력받음
arr = s.split(""); //split을 이용하여 구분하여 배열에 저장
for(int j=0;j<arr.length;j++) { //배열의 길이만큼 반복
if(arr[j].equals("(")) //"(" 문자열이 입력됐을 경우
{
stack.push(arr[j]); //stack에 추가
}
else{ //다른 문자열이 입력됐을 경우
if(stack.isEmpty()) //stack이 비어있다면
{
stack.push(arr[j]); //입력한 문자열 stack에 추가
break; //탈출(종료)
}
else{ //stack에 값이 있다면
stack.pop(); //해당 문제를 stack에서 지움
}
}
}
if(stack.isEmpty()) //stack이 비었다면
{
System.out.println("YES"); //"YES" 출력
}
else{ //stack에 값이 있다면
System.out.println("NO"); //"NO" 출력
}
stack.clear();
}
}
}
추가 🕤
문제를 풀 때 왜? 라는 질문을 던지기. 기능 하나를 하더라도 왜 이걸 써야되는지?? 이 기능 왜 필요할까?
팀원들과 저녁 식사 이후 오늘 배운 내용 정리 및 피드백 시간을 가지는데 모두들 문제 하나를 풀으시더라도 예를 들어 2가지 쓸 수 있는 방법이 있는데 ‘왜 이걸 쓰는걸까?’ 라는 고민을 많이 하셨다고 합니다. 고민하며 검색도 하고 질문도 하는 과정을 거치며 내 것으로 만드는 이 과정이 저에게도 필요하다고 느끼며 오늘 하루를 마무리 합니다.
🐱🏍— —🤸🏻♀️ ~~~ 야~호~