반응형
12-01 05:41
Today
Total
«   2024/12   »
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
관리 메뉴

개발하는 고라니

[백준] 4949번 : 균형잡힌 세상 본문

Programming/백준

[백준] 4949번 : 균형잡힌 세상

조용한고라니 2021. 3. 26. 12:02
반응형
 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net


[문자열, Stack]

이 문제를 풀기 전 아스키 코드를 알면 좋다. 아스키 코드 표를 참고하면

'(' : 40

')' : 41

'[' : 91

']' : 93

위와 같다. 따라서 ')' - '(' = 1이고, ']' - '[' = 2이다. 이 규칙만 잘 활용하면 쉽게 풀 수 있다.

 

먼저 스택을 준비하는데, 동적의 크기를 갖는 컬렉션 또는 자료구조로 할 수 있지만, 배열로도 충분하기 때문에 배열로 스택을 구현해주었다. 그리고 타겟의 문자를 저장하는 배열을 따로 준비한다.

char[] stack = new char[100];
int top = -1;

//---

static char[] bracket = {'[', '(', ')', ']'};

이제 문자열을 받아 char[]로 변환 후 첫 글자가 '.'이면 종료하도록 하고, 각 문자가 위의 bracket에 해당하는 문자가 있으면 다음과 같은 로직을 수행한다.

            for(char c:arr)
                for(int a=0; a<4; a++)
                    if(c == bracket[a]) {
                        if (top != -1 && (c - stack[top] == 2 || c - stack[top] == 1))
                            --top;
                        else
                            stack[++top] = c;
                    }

stack에 가장 위의 있는 문자와 마이너스 연산을 했을 때 1 또는 2가 나오면 pop을 하도록 한다.

그게 아니라면 스택에 문자를 추가한다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static char[] bracket = {'[', '(', ')', ']'};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        while(true){
            String origin = br.readLine();
            char[] arr = origin.toCharArray();

            if(arr[0] == '.') break;

            int top = -1;
            char[] stack = new char[100];

            for(char c:arr)
                for(int a=0; a<4; a++)
                    if(c == bracket[a]) {
                        if (top != -1 && (c - stack[top] == 2 || c - stack[top] == 1))
                            --top;
                        else
                            stack[++top] = c;
                    }

            sb.append(top == -1? "yes":"no").append('\n');
        }
        System.out.println(sb);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 6603번 : 로또  (0) 2021.03.26
[백준] 9935번 : 문자열 폭발  (0) 2021.03.26
[백준] 14503번 : 로봇 청소기  (0) 2021.03.26
[백준] 1094번 : 막대기  (0) 2021.03.25
[백준] 16985번 : Maaaaaaaaaze  (0) 2021.03.25
Comments