컴퓨터 공부/📚 Baekjoon(백준)

[백준/알고리즘/python/java] 4949번 - 균형잡힌 세상

letzgorats 2021. 2. 13. 17:07

 이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.
[4949번 - 균형잡힌 세상]

백준 9012번 괄호 문제에서 소괄호 뿐만 아니라 대괄호도 추가되었다고 생각하면 된다.

입력의 종료조건으로 맨 마지막에 점 하나(".")만 들어온다고 했으니,

무한루프를 만들고, 입력이 점 하나(".")라면 프로그램이 종료되게 하고 그렇지 않으면 계속해서 

입력을 하도록 구현하면 된다.

맨 처음에는 IndexError 가 났었다.

(IndexError가 났었던 코드)

stack = []
while(True):
    line = input()
    if(line == "."):
        break
    for s in line:
        if s == "(" or s == "[":
            stack.append(s)
        elif s == ")":
            if stack[-1] == "(":
                stack.pop()
            else:
                break
        elif s == "]":
            if stack[-1] == "[":
                stack.pop()
            else:
                break
    if (len(stack) == 0) and s == ".":
        print("yes")
    else:
        print("no")

문제가 어디일까 살펴봤더니,  stack[-1] 부분에서 잘못됐었다.

처음부터 ")" 가 입력될 수 있으니, 그런 상황을 처리하기 위해 

문자열을 하나씩 읽되, ")" 를 발견했을 시, stack의 길이가 0이면 break될 수 있도록 설정을 추가하였다.

또, 새로운 입력을 받기 전에 stack을 clear() 해주는 것도 추가해주었다. 

 

(아래는 최종 파이썬 코드이다.-python)

stack = []
while(True):
    line = input()
    if(line == "."):
        break
    for s in line:
        if s == ")":
            if len(stack) == 0:
                break
            if stack[-1] == "(":
                stack.pop(-1)
            else:
                break
        elif s == "]":
            if len(stack) == 0:
                break
            if stack[-1] == "[":
                stack.pop(-1)
            else:
                break
        elif s == "(" or s == "[":
            stack.append(s)

    if (len(stack) == 0) and s == ".":
        print("yes")
        stack.clear()
    else:
        print("no")
        stack.clear()

(아래는 이전에 풀었던 자바 코드이다. -java)

import java.io.*; 
import java.util.Stack; 
public class Main { 
    public static void main(String[] args) throws IOException { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        int input_len, i; 
        Stack<Character> stack = new Stack<Character>(); 
        char t; 
        String input = br.readLine(); 
        while(!input.equals(".")) { 
            stack.clear(); 
            input_len = input.length(); 
            for(i = 0; i < input_len; i++) { 
                t = input.charAt(i); 
                if(t == '(' || t == '[') { 
                    stack.push(t); 
                } 
                else if(t == ')' || t == ']') { 
                    if(stack.isEmpty() || (t == ')' && stack.peek() != '(') || (t == ']' && stack.peek() != '[')) { 
                        stack.push(t); 
                        break; 
                    }
                    stack.pop(); 
                } 
            } 
            if(stack.isEmpty()) { 
                System.out.println("yes"); 
            } 
            else { 
                System.out.println("no"); 
            } 
            input = br.readLine();
        } 
    } 
}
반응형