Algorithm/[BOJ] - JAVA

[백준] 10799 : 쇠막대기 JAVA 풀이

Codew 2022. 9. 29. 18:41

 

 

문제를 읽고 어떻게 풀어야 하는지 전혀 감이 오지 않았다....

 

우선 문자열을 입력을 받는다.

 

문자열을 구성하는 문자는 '(' 또는 ')' 이다.

 

1. '('가 입력된 경우에는 스택에 push해준다.

 

2. ')'가 입력된 경우는 두 가지 케이스로 다시 나눠볼 수 있다.

    2-1. 이전 문자가 '('일 경우, 즉 레이저인 경우

            스택에 있던 '('를 pop하고 스택의 크기(= 쇠막대기의 개수)만큼 더해준다.

    2-2. 이전 문자가 ')'일 경우, 즉 한 막대기의 끝일 경우

            스택에 있던 '('를 pop하고 1을 더해준다. 

 

 

한 막대기의 끝을 나타내는 ')'일 경우 1을 더해주는 이유는 위 그림을 보면 이해가 갈 것이다.

그 막대는 더 이상 쪼개질 일이 없기 때문에 그 마지막 조각의 개수인 1을 더해주는 것이다.

 

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 문자열을 입력받음
		String str = br.readLine();
        // 문자열을 구성하는 문자들을 저장할 스택을 생성
		Stack<Character> s = new Stack<Character>();
		
        // 잘린 막대의 개수를 셀 변수
		int res = 0;
		
        // 입력받은 문자열의 길이만큼 반복
		for(int i=0;i<str.length();i++) {
        	// 문자열의 한 글자씩 읽음
			char c = str.charAt(i);
			
            // '(' 이라면 스택에 push
			if(c=='(') {
				s.push(c);
			}
            
			// ')' 이라면 
			else if(c==')'){
            	// 스택에 들어있던 '(' 를 pop
				s.pop();
                
                // 직전에 입력된 문자가 '(' 이었다면 == 레이저라면 
				if(str.charAt(i-1)=='(') {
                	// 스택의 크기(= 쇠막대기의 개수)만큼 더해줌
					res += s.size();
				}
                
                // 직전에 입력된 문자가 ')' 이었다면 == 한 막대기의 끝이라면
				else {
                	// 1을 더해줌
					res += 1;
				}
				
			}
		}
        // 잘린 막대기의 총 개수를 출력함
		System.out.println(res);
	}

}