[백준/JAVA] 2504번: 괄호의 값
🔺 문제
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X
www.acmicpc.net
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<String> stack = new Stack<>();
int result = 0;
int cnt = 1; // 괄호값 계산 위한 변수
for(int i = 0 ; i < str.length() ; i++) {
String s = String.valueOf(str.charAt(i));
switch(s) {
case "(" :
stack.push("(");
cnt *= 2;
break;
case ")" :
if(stack.isEmpty() || !stack.peek().equals("(")) {
result = 0;
break;
}
// stack.peek().equals("(") 로 하면 틀림!
if(str.charAt(i - 1) == '(') {
result += cnt;
}
stack.pop();
cnt /= 2;
break;
case "[" :
stack.push("[");
cnt *= 3;
break;
case "]" :
if(stack.isEmpty() || !stack.peek().equals("[")) {
result = 0;
break;
}
if(str.charAt(i - 1) == '[') {
result += cnt;
}
stack.pop();
cnt /= 3;
break;
}
}
System.out.println(!stack.isEmpty() ? 0 : result);
}
}
|
cs |
89퍼에서 틀렸다....
왜지 하고 질문 게시판을 찾아보았다...
- 정답
글 읽기 - 2504 자바
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<String> stack = new Stack<>();
boolean flag = true; // **추가** 괄호의 짝이 맞는지 확인하는 변수
int result = 0;
int cnt = 1;
for(int i = 0 ; i < str.length() ; i++) {
String s = String.valueOf(str.charAt(i));
switch(s) {
case "(" :
stack.push("(");
cnt *= 2;
break;
case ")" :
if(stack.isEmpty() || !stack.peek().equals("(")) {
flag = false; // **변경**
break;
}
// stack.peek().equals("(") 로 하면 틀림! (반례 : [[[]]]) )
if(str.charAt(i - 1) == '(') {
result += cnt;
}
stack.pop();
cnt /= 2;
break;
case "[" :
stack.push("[");
cnt *= 3;
break;
case "]" :
if(stack.isEmpty() || !stack.peek().equals("[")) {
flag = false; // **변경**
break;
}
if(str.charAt(i - 1) == '[') {
result += cnt;
}
stack.pop();
cnt /= 3;
break;
// ** 변경 **
default:
flag = false;
break;
}
}
System.out.println( (!flag || !stack.isEmpty()) ? 0 : result); // ** 변경 **
}
}
|
cs |
해당 글을 통해 위 코드처럼 제출했더니 정답으로 나왔다..
✅ 해결 아이디어
✔ 스택
💥 유의사항
• 닫는 괄호일 때, stack.peek().equals(여는 괄호)
로 하면 안 됨. (반례 : [[[]]])
• 반례 : ((()
글 읽기 - 90%에서 틀렸다고 뜨는데 왜 그런지 모르겠어요 ㅠㅠ
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
🔺 다른 풀이들
- 오.. 분배법칙!!!ㅠㅠㅠ 덕분에 이해할 수 있었다...
[백준] 2504. 괄호의 값 (자바 JAVA)
[ 문제 ] BOJ 2504. 괄호의 값 문제 링크 : https://www.acmicpc.net/problem/2504 2504번: 괄호의 값 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이
ilmiodiario.tistory.com
- 닫는 괄호일 때, stack.peek().equals(여는 괄호)로 하고 싶으면 이렇게
[BOJ] 백준 [2504] 괄호의 값JAVA
https://www.acmicpc.net/problem/2504 2504번: 괄호의 값 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진
katastrophe.tistory.com
💬 느낀 점
내가 좋아하는 스택이라 즐거운 마음으로 문제를 봤더니..
응용 문제인데 구현을 못 해서
이 자식(=나) 이해하는데 생각보다 오래 걸림..
손에 익히자이...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 12.10 | 240225 |
(+12.10 2회독)
- 분기를 잘 나눠주어야 한다,,
- 스택의 최상단 값만 갖고 비교하는 게 아니라, 문자열의 이전 인덱스의 값까지 들고와 비교하며 확인해야 한다,,
코드 확인하기
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] ch = br.readLine().toCharArray();
Stack<Character> stack = new Stack<>();
int result = 0;
int num = 1;
for(int i = 0 ; i < ch.length ; i++) {
if(ch[i] == '(') {
stack.push('(');
num *= 2;
}
else if(ch[i] == ')') {
if(stack.isEmpty()) {
result = 0;
break;
}
char beforeC = stack.pop();
if(beforeC != '(') {
result = 0;
break;
}
else {
// 현재 idx 바로 전 idx - 1번째 문자가 여는 괄호일 경우에만 더함
if(ch[i - 1] == '(') {
result += num;
}
num /= 2;
}
}
else if(ch[i] == '[') {
stack.push('[');
num *= 3;
}
else if(ch[i] == ']') {
if(stack.isEmpty()) {
result = 0;
break;
}
char beforeC = stack.pop();
if(beforeC != '[') {
result = 0;
break;
}
else {
// 현재 idx 바로 전 idx - 1번째 문자가 여는 괄호일 경우에만 더함
if(ch[i - 1] == '[') {
result += num;
}
num /= 3;
}
}
}
System.out.println(!stack.isEmpty() ? 0 : result);
}
}
|
cs |
(참고)
[BOJ- JAVA] 백준 2504 괄호의 값
링크 문제 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이
velog.io