SZCODE 2020. 5. 11. 17:05

https://programmers.co.kr/learn/courses/30/lessons/42585

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

목표 : 여러 개의 쇠막대기에서 레이저로 자른 후 개수 구하기

조건 : (a) 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 '( )'으로 표현합니다. 또한 모든 '( )'는 반드시 레이저를 표현합니다.
        (b) 쇠막대기의 왼쪽 끝은 여는 괄호 '('로, 오른쪽 끝은 닫힌 괄호 ')'로 표현됩니다.

스택 활용. 배열에서 처음부터 끝까지 확인하며
1.  (  일 경우 스택에 삽입해준다.
2.  )  일 경우 
    2-1. 이전이 ( 였으면 레이저 이므로 스택에서 제거한 뒤에 스택 사이즈(쇠막대기의 개수)를 더해서 갱신해준다.
    2-2. 이전이 ) 였으면 괄호의 짝이 끝난 것이기 때문에 +1 을 해주고 스택에서 제거해준다. (순서는 상관없음)

몰랐던 점 : 이전에 있던 것은 배열에서 가져와야 한다. 스택에 쌓이는 것은 ( 만 쌓인다. 
               스택은 인덱스로 되어있어 스택의 top에 있는 것을 가져오기 위해서는 stack.size()-1로 구한다.
import java.util.Stack;

class Solution {
	public int solution(String arrangement) {
		int answer = 0;
		Stack<Character> stack = new Stack<>();

		for (int i = 0; i < arrangement.length(); i++) {
			if (arrangement.charAt(i) == '(') {
				stack.push(arrangement.charAt(i));
			} else {// )일때
				//이전이 ( 이면 레이져
				if (arrangement.charAt(i-1)=='(') {
					stack.pop();
					answer += stack.size();
				}
				// 이전이 ) 이거엿으면 그냥 pop
				else {
					
					stack.pop();
					answer++;

				}
			}
		}
		return answer;
	}
}