문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
이 문제에 핵심
1. '( )' 괄호 쌍 : 2, '[ ]' 괄호 쌍 : 3의 값을 표현합니다.
2. 괄호 안에 다른 괄호값이 존재하면 ×을 진행합니다.
3. 괄호에 대한 문자열을 주어질 때 나타내는 정수를 결과로 출력합니다.
4. 입력이 올바르지 않은 괄호일 경우 0을 결과로 출력합니다.
알고리즘 진행 순서.
1. 입력된 정보를 저장합니다.
2. 괄호의 문자열을 순차적으로 탐색합니다.
3. 탐색이 끝난 뒤 구한 정수를 결과로 출력합니다.
괄호 문자열 탐색.
저는 Stack을 이용해서 괄호의 정보들을 저장하였습니다.
열린 괄호 '(' 와 '[' 일 때
Stack에 괄호 정보 Push!
올바르지 않는 괄호일 때.
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();
}
}
'백준' 카테고리의 다른 글
[백준] 알고리즘 분류(구현,JAVA)2638번, 치즈 (0) | 2023.01.04 |
---|---|
[백준] 알고리즘 분류(구현,JAVA)2636번, 치즈 (0) | 2022.12.30 |
[백준] 알고리즘 분류(구현,JAVA)2573번, 빙산 (2) | 2022.12.28 |
[백준] 알고리즘 분류(구현,JAVA)3190번, 뱀 (0) | 2022.12.26 |
[백준] 알고리즘 분류(구현,JAVA)14891번, 톱니바퀴 (0) | 2022.12.26 |
댓글