본문 바로가기
백준

[백준] 알고리즘 분류(구현,JAVA)2504번, 괄호의 값

by 열정적인 이찬형 2022. 12. 28.

문제 링크

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

 

1. '( )' 괄호 쌍 : 2, '[ ]' 괄호 쌍 : 3의 값을 표현합니다.

2. 괄호 안에 다른 괄호값이 존재하면 ×을 진행합니다.

3. 괄호에 대한 문자열을 주어질 때 나타내는 정수를 결과로 출력합니다.

4. 입력이 올바르지 않은 괄호일 경우 0을 결과로 출력합니다.

 

알고리즘 진행 순서.

 

1. 입력된 정보를 저장합니다.

 

2. 괄호의 문자열을 순차적으로 탐색합니다.

 

3. 탐색이 끝난 뒤 구한 정수를 결과로 출력합니다.

 

 

괄호 문자열 탐색.

 

저는 Stack을 이용해서 괄호의 정보들을 저장하였습니다.
※ 괄호에 대한 정보에 관한 클래스 info를 만들어서 저장하였습니다.

 

열린 괄호 '(' 와 '[' 일 때

 

Stack에 괄호 정보 Push!

 

열린 괄호 ')' 와 ']' 일 때

 

Stack.pop()을 진행하여 괄호쌍을 완성시키기!

 

Stack.peek()값이 존재할 때 괄호에 대한 값을 더하기!
 
Stack.isEmpty()일 때 지금까지 계산한 괄호값 answr 변수에 저장!
 

올바르지 않는 괄호일 때.

 

1) 가장 최근 열린 괄호가 '(' 일 때 : 닫히는 괄호 ']'과 왔을 때

 

2) 가장 최근 열린 괄호가 '[' 일 때 : 닫히는 괄호 ')'과 왔을 때

 

3) 가장 최근 열린 괄호가 없을 때 : 닫히는 괄호가 왔을 때

 

4) 모든 탐색이 종료되었지만 열린 괄호가 남아있을 때

 

4가지 조건 중 1개라도 만족하면 탐색을 종료하고 0을 결과로 출력합니다.
 

예제입력 2.

 

1. 입력된 정보를 저장합니다.

 

괄호 문자열 : [][]((])

 

2. 괄호의 문자열을 순차적으로 탐색합니다.

 

괄호 문자열 탐색

 

괄호 문자열 : [][]((])

 

Stack

[
0

 

괄호 문자열 : [][]((])

 

Stack.pop()을 진행하여 괄호쌍을 완성 : [ ]

 

Stack.isEmpty()일 때 지금까지 계산한 괄호값 answr 변수에 저장!

 

answer += 3

 

괄호 문자열 : [][]((])

 

Stack

[
0

 

괄호 문자열 : [][]((])

 

Stack.pop()을 진행하여 괄호쌍을 완성 : [ ]

 

Stack.isEmpty()일 때 지금까지 계산한 괄호값 answr 변수에 저장!

 

answer += 3

 

괄호 문자열 : [][]((])

 

Stack

(
0

 

괄호 문자열 : [][]((])

 

Stack

( (
0 0

 

괄호 문자열 : [][]((])

 

1) 가장 최근 열린 괄호가 '(' 일 때 : 닫히는 괄호 ']'과 왔을 때

 

탐색 종료!

 

3. 탐색이 끝난 뒤 구한 정수를 결과로 출력합니다.

 

올바르지 않는 괄호가 주어졌으므로

 

0을 결과로 출력합니다.

 

  • BufferedReader를 사용하여 입력되는 정보를 저장합니다.
  • Stack을 이용하여 괄호 문자열을 순차적으로 탐색합니다.
  • 탐색 중 올바르지 않는 괄호 문자열일 때 탐색을 종료합니다.
  • 탐색에 따른 결과를 BufferedWriter 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.

 

결과코드

import java.io.*;
import java.util.Stack;

public class Main{
    //괄호에 대한 정보 클래스
    static class info{
        char c;		//열린 괄호 '(' , '['
        int value;	//괄호의 값
        //생성자
        public info(char c, int value){
            this.c = c;
            this.value = value;
        }
    }
    public static void main(String[] args) throws IOException {
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = br.readLine();
        int answer = 0;
        Stack<info> stack = new Stack<>();
        //괄호 탐색 시작!
        for(int i=0;i<str.length();i++){
            char c = str.charAt(i);
            //열린 괄호일 때
            if(c == '(' || c == '[')
                stack.push(new info(c, 0));	//Stack에 Push!
            else{		//닫힌 괄호일 때
                //올바르지 않은 괄호 문자열일 때 1), 2), 3)
                if(stack.isEmpty() || (stack.peek().c == '(' && c == ']')
                        || (stack.peek().c=='[' && c == ')')){
                    answer = 0;
                    break;
                }
                info cur = stack.pop();		//Stack에 값 가져오기!
                int mul = c == ')' ? 2 : 3;	//괄호에 따른 값 구하기
                //괄호의 값이 0일 때 1로 변경!
                cur.value = cur.value==0 ? 1 : cur.value;
                //스택이 비어있을 때 answer += 괄호 값
                if(stack.isEmpty())
                    answer += cur.value * mul;
                else	//stack.peek()값에 현재 괄호값 더하기!
                    stack.peek().value += mul * cur.value;
            }
        }
        if(!stack.isEmpty())	//올바르지 않는 괄호 문자열일 때 4)
            answer = 0;
        bw.write(answer + "");	//탐색에 따른 결과 BufferedWriter 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
}

댓글