백준 - 괄호의 값 ( 2504번, JAVA )

changi123·2025년 1월 13일
1
post-thumbnail

Stack ( https://www.acmicpc.net/problem/2504 )

풀이

  • 문제를 이해하는데 시간이 좀 걸렸다.. 😂

  • 스트링으로 받은 char(i) 가 ( 이면 ( 개수를 증가시키기위해 cnt*2 + 스택에 ( 저장

  • 스트링으로 받은 char(i) 가 [ 이면 [ 개수를 증가시키기위해 cnt*3 + 스택에 [ 저장

  • 만약 char(i) 가 ')' 라면 먼저 성립되는 괄호인지 체크하기위해 스택에 있는 값이 '(' 여는 괄호가 아니거나 스택이 비어있다면 문제 성립이 안됨 flag = false 후 탈출

  • 만약 스택에 있는 값이 '(' 라면 현재까지 나온 더해진 cnt를 answer에 합산 후 다시 cnt / 2 하고 st.pop();

  • 만약 char(i) 가 ']' 라면 먼저 성립되는 괄호인지 체크하기위해 스택에 있는 값이 '[' 여는 괄호가 아니거나 스택이 비어있다면 문제 성립이 안됨 flag = false 후 탈출

  • 만약 스택에 있는 값이 '[' 라면 현재까지 나온 더해진 cnt를 answer에 합산 후 다시 cnt / 3 하고 st.pop();

  • 처음 42%에서 틀렸다고 떠서 반례를 찾아보니 만약 스택이 비어있지 않는 경우 무조건 성립이 되지 않음으로 마지막 조건에 !st.isEmpty() 를 추가해서 정답 처리가 됐다 😮

package problem_solving.stack;

import java.util.Scanner;
import java.util.Stack;

public class BaekJoon_2504 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		String s = sc.next();
		Stack<Character> st = new Stack<>();

		int cnt = 1 ;
		int answer = 0  ;

		boolean flag = true; 
		for(int i =0  ; i<s.length();i++) {
			char c = s.charAt(i);
			if( c == '(') {
				st.push(c);
				cnt *= 2;
			} else if( c=='[') {
				st.push(c);
				cnt *= 3; 
			} else {
				if( c == ')') {
					if( st.isEmpty() || st.peek() != '(') {
						flag = false; 
						break;
					} 

					if( s.charAt(i-1) =='(' ) {
						answer += cnt ; 

					}

					st.pop();
					cnt /= 2;
				} else if( c == ']') {
					if( st.isEmpty() || st.peek() != '[') {
						flag = false ;
						break;
					}
					if ( s.charAt(i-1) == '[') {
						answer+=cnt ;
					}
					st.pop();
					cnt /=3;
				}
			}

		}
		if( !flag || !st.isEmpty()) {
			System.out.println(0);
		} else {
			System.out.println(answer);
		}

	}

}

profile
개발자 홍찬기 꾸준한 사람이 되자

0개의 댓글

관련 채용 정보