혼자 공부하는 공간

[JAVA] 백준 4949. 균형잡힌 세상(문자열처리) :: 로직/코드 - GODZ 본문

알고리즘/문자열처리

[JAVA] 백준 4949. 균형잡힌 세상(문자열처리) :: 로직/코드 - GODZ

god_z 2020. 7. 30. 18:02

안녕하세요 GODZ입니다.

오늘은 문자열 처리를 이용한 문제를 풀어볼 예정입니다.


1. 문제

사진을 클릭하면 문제 페이지로 이동합니다

 

2. 입출력 예제

 

3. 접근

 흔한 괄호 문제인데 생각보다 정답률이 많이 낮아서 가지고 온 문제입니다. 문자열 사이에 들어간 (, [ 와 ), ]가 제대로 짝이 맞게 들어갔는지 확인하는 문제입니다.

 핵심은 닫히는 괄호에서 처리하는 로직입니다. 여는 괄호에서는 그냥 Stack에 push작업만 하면 되지만, 닫히는 괄호에서는 몇 가지 처리를 잘해주셔야 통과할 수 있습니다.

 닫히는 괄호일 때, 아래와 같은 사항들을 체크해야 합니다.

더보기

1. Stack이 비어있는가?

2. 비어있지 않다면 짝이 맞는 괄호인가?

1에서 비어있는지 체크하지 않으면 런타임 에러가 뜰 수 있습니다.

2에서 짝이 맞지 않는 괄호라면 no를 출력하고 다음 문장을 순회합니다. 맞는 괄호라면 pop작업을 시행합니다.

 

4. 로직

  1. 입력받은 문장을 순회하면서 괄호( '(', '[', ')', ']' )인지 확인 

  2. 여는 괄호라면 push

  3. 닫는 괄호라면 스택이 비어있는지 확인

    1. 스택이 비어있다면 "no" 출력 후 break

    2. 스택이 비어있지 않다면 짝이 맞는 괄호인지 확인

      1. 짝이 맞지 않다면 "no" 출력 후 break
      2. 짝이 맞다면 pop
  4. '.' 이라면 문장의 마지막을 뜻함 (여기까지 왔다면 정상적으로 괄호가 맞았다는 뜻)

    1. Stack이 비어있다면 정상적으로 짝이 맞았고 "yes" 출력

    2. Stack이 비어있지 않다면 여는 괄호가 더 많았다는 뜻이므로 "no" 출력

  5. 다음 문장 수행 및 Stack 초기화 진행

 

5. 코드

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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));
        StringBuilder res = new StringBuilder();
        while(true) {
            String input = br.readLine();
            if(input.equals(".")) {
                break;
            } else {
                // Stack Init
                Stack<Character> stack = new Stack<>();
                char[] c_arr = input.toCharArray();
                for(int i = 0; i < c_arr.length; i++) {
                    char c = c_arr[i];
                    
                    // 여는 괄호
                    if(c == '(' || c == '[') {
                        stack.push(c);
                    } 
                    // 닫는 괄호
                    else if(c == ')' || c == ']') {
                        if(stack.isEmpty()) {
                            res.append("no\n");
                            break;
                        } else {
                            char comp = (c == ')') ? '(' : '[';
                            if(stack.peek() != comp) {
                                res.append("no\n");
                                break;
                            } else {
                                stack.pop();
                            }
                        }
                    }
                    // 마지막 문자
                    else if(c == '.') {
                        if(stack.isEmpty()) {
                            res.append("yes\n");
                            break;
                        } else {
                            res.append("no\n");
                            break;
 
                        }
                    }
                }
            }
        }
        
        System.out.println(res.toString());
    }
}
 
cs

 

6. 결과

 

Comments