코테/백준

[백준/JAVA] 2504번: 괄호의 값

imname1am 2023. 5. 20. 17:49
반응형

🔺 문제

 

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

 

 

반응형