Post

TIL-백준 9012번 문제 고찰

TIL-백준 9012번 문제 고찰

2024-04-24

오늘의 학습 🌠


1

고민한 문제 😏


  • 백준 9012번 문제

1

  • 해당 문제는 괄호 ‘(‘, ‘)’, 로만 이루어져있고 해당 괄호가 쌍으로 이루어져있으면 “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" 출력
            }
        }
    }
}

  • 그러나 예제를 실행하면 1

  • 출력이 다음과 같이 나와야되는데 1

  • 출력이 “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가지 쓸 수 있는 방법이 있는데 ‘왜 이걸 쓰는걸까?’ 라는 고민을 많이 하셨다고 합니다. 고민하며 검색도 하고 질문도 하는 과정을 거치며 내 것으로 만드는 이 과정이 저에게도 필요하다고 느끼며 오늘 하루를 마무리 합니다.

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.