All :L
[BOJ/Java] 괄호의 값 (2504) 본문
반응형
1. 문제 분석
문제 개요
- 주어진 문자열에서 괄호의 짝을 맞추고, 괄호가 짝이 맞을 때 각각의 괄호에 대해 특정 값을 계산하는 문제이다.
- 괄호가 올바르게 쌍을 이루어야 하며, 계산된 값은 괄호의 짝을 이루는 방식에 따라 다르다.
입력 형식
- 한 줄에 괄호로 구성된 문자열이 주어진다.
출력 형식
- 괄호가 올바르게 짝을 이루면 계산된 값을 출력하고, 그렇지 않으면
0
을 출력한다.
2. 알고리즘 종류
이 문제는 스택을 이용한 괄호의 짝 맞추기와 계산 문제이다. 스택을 사용하여 괄호를 처리하고, 괄호의 짝에 따라 값을 계산한다.
3. 주요 부분 및 코드 작성 방법
1. 스택 사용 및 괄호 처리
- 여는 괄호는 스택에 추가하고, 닫는 괄호는 스택에서 짝을 맞추어 제거한다.
- 괄호 쌍에 대한 계산은 현재 스택의 상태와 괄호의 종류에 따라 다르다.
2. 현재 괄호와 스택의 상태 비교
- 닫는 괄호가 나오면, 스택의 최상단과 비교하여 올바른 쌍인지 확인한다.
- 올바른 쌍이라면 계산을 수행하고, 아니라면 오류를 표시한다.
4. 코드 설명
메인 함수 (main
)
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)); // 입력을 받기 위한 BufferedReader 객체 생성
String line = br.readLine(); // 괄호로 구성된 문자열을 입력받음
Stack<Character> st = new Stack<>(); // 문자형 스택 생성
boolean flag = true; // 괄호 쌍의 유효성을 체크하는 플래그
int answer = 0; // 최종 계산 결과
int cnt = 1; // 현재 괄호 쌍의 계산 값
for (int i = 0; i < line.length(); i++) { // 문자열의 각 문자에 대해 반복
char cur = line.charAt(i); // 현재 문자를 가져옴
if (cur == '(') { // 여는 괄호일 경우
st.push(cur); // 스택에 여는 괄호 추가
cnt *= 2; // 여는 괄호의 계산 값 증가
} else if (cur == '[') { // 여는 대괄호일 경우
st.push(cur); // 스택에 여는 대괄호 추가
cnt *= 3; // 여는 대괄호의 계산 값 증가
} else { // 닫는 괄호일 경우
if (cur == ')') { // 닫는 괄호가 ')'일 경우
if (st.isEmpty() || st.peek() != '(') { // 스택이 비어있거나 최상단이 '('가 아닐 경우
flag = false; // 유효하지 않음
break;
}
if (line.charAt(i - 1) == '(') { // 바로 앞 문자가 '('일 경우
answer += cnt; // 계산 값 더하기
}
st.pop(); // 스택에서 '(' 제거
cnt /= 2; // 계산 값 감소
} else if (cur == ']') { // 닫는 대괄호가 ']'일 경우
if (st.isEmpty() || st.peek() != '[') { // 스택이 비어있거나 최상단이 '['가 아닐 경우
flag = false; // 유효하지 않음
break;
}
if (line.charAt(i - 1) == '[') { // 바로 앞 문자가 '['일 경우
answer += cnt; // 계산 값 더하기
}
st.pop(); // 스택에서 '[' 제거
cnt /= 3; // 계산 값 감소
} else { // 올바르지 않은 문자일 경우
flag = false; // 유효하지 않음
break;
}
}
}
if (!flag || !st.isEmpty()) { // 괄호의 짝이 맞지 않거나 스택이 비어있지 않은 경우
System.out.println(0); // 결과로 0 출력
} else {
System.out.println(answer); // 계산된 결과 출력
}
}
}
5. 전체 코드
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)); // 입력을 받기 위한 BufferedReader 객체 생성
String line = br.readLine(); // 괄호로 구성된 문자열을 입력받음
Stack<Character> st = new Stack<>(); // 문자형 스택 생성
boolean flag = true; // 괄호 쌍의 유효성을 체크하는 플래그
int answer = 0; // 최종 계산 결과
int cnt = 1; // 현재 괄호 쌍의 계산 값
for (int i = 0; i < line.length(); i++) { // 문자열의 각 문자에 대해 반복
char cur = line.charAt(i); // 현재 문자를 가져옴
if (cur == '(') { // 여는 괄호일 경우
st.push(cur); // 스택에 여는 괄호 추가
cnt *= 2; // 여는 괄호의 계산 값 증가
} else if (cur == '[') { // 여는 대괄호일 경우
st.push(cur); // 스택에 여는 대괄호 추가
cnt *= 3; // 여는 대괄호의 계산 값 증가
} else { // 닫는 괄호일 경우
if (cur == ')') { // 닫는 괄호가 ')'일 경우
if (st.isEmpty() || st.peek() != '(') { // 스택이 비어있거나 최상단이 '('가 아닐 경우
flag = false; // 유효하지 않음
break;
}
if (line.charAt(i - 1) == '(') { // 바로 앞 문자가 '('일 경우
answer += cnt; // 계산 값 더하기
}
st.pop(); // 스택에서 '(' 제거
cnt /= 2; // 계산 값 감소
} else if (cur == ']') { // 닫는 대괄호가 ']'일 경우
if (st.isEmpty() || st.peek() != '[') { // 스택이 비어있거나 최상단이 '['가 아닐 경우
flag = false; // 유효하지 않음
break;
}
if (line.charAt(i - 1) == '[') { // 바로 앞 문자가 '['일 경우
answer += cnt; // 계산 값 더하기
}
st.pop(); // 스택에서 '[' 제거
cnt /= 3; // 계산 값 감소
} else { // 올바르지 않은 문자일 경우
flag = false; // 유효하지 않음
break;
}
}
}
if (!flag || !st.isEmpty()) { // 괄호의 짝이 맞지 않거나 스택이 비어있지 않은 경우
System.out.println(0); // 결과로 0 출력
} else {
System.out.println(answer); // 계산된 결과 출력
}
}
}
반응형
'CODING > BOJ' 카테고리의 다른 글
[BOJ/Java] 달력 (20207) (0) | 2024.08.28 |
---|---|
[BOJ/Java] 스택 수열 (1874) (0) | 2024.08.27 |
[BOJ/Java] 괄호 (9012) (0) | 2024.08.26 |
[BOJ/Java] 스택 (10828) (0) | 2024.08.26 |
[BOJ/Java] 알파벳 (1987) (0) | 2024.08.26 |
Comments