코딩테스트/프로그래머스 level 2

[프로그래머스 level_2 / 월간 코드 챌린지 시즌2] 괄호 회전하기 for JAVA

냠냠:) 2021. 5. 9. 23:35

programmers.co.kr/learn/courses/30/lessons/76502

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

[문제 설명]

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • s의 길이는 1 이상 1,000 이하입니다.

입출력 예

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

 

[풀이]

문제 그대로 한 칸씩 왼쪽으로 이동시키면서 괄호들이 잘 매칭 되는지 파악하면 되는 문제이다.

 

이런 괄호 문제일 경우 스택을 자주 사용하는데

 

여는 괄호면 스택에 push 해주고 닫는 괄호면 최근에 스택에 쌓인 괄호가 닫는 괄호와 매칭이 되는지 판단하여 문제를 풀어주면 된다.

 

[코드]

/**
 * level 2 / 월간 코드 챌린지 시즌2 
 * 괄호 회전하기
 * https://programmers.co.kr/learn/courses/30/lessons/76502
 */
public int solution(String s) {
	
	int answer = isCorrect(s);					//for문을 돌면서 한칸 씩 이동 시키기 전 수행
	
	for(int i = 1; i < s.length(); i++) {
		s = s.substring(1) + s.charAt(0);		//왼쪽으로 한칸 씩 이동
		
		answer += isCorrect(s);					//올바르지 않으면 + 1
	}
	
	return answer;
}

public int isCorrect(String s) {
	Stack<Character> stack = new Stack<>();
	
	try {
		//스택에 넣기
		for(int i = 0; i < s.length(); i++) {
			if(s.charAt(i) == '}') {		//닫는 괄호}, ), ] 일 때 스택에 최근에 쌓인 괄호가 여는 괄호인지 판단
				if(stack.peek() != '{') {
					return 0;
				}
				stack.pop();
			}else if(s.charAt(i) == ']') {
				if(stack.peek() != '[') {
					return 0;
				}
				stack.pop();
			}else if(s.charAt(i) == ')') {
				if(stack.peek() != '(') {
					return 0;
				}
				stack.pop();
			}else {							//여는 괄호(, {, ( 면 스택에 추가
				stack.add(s.charAt(i));
			}
		}
	}catch (Exception e) {					//빈 스택 참조시 발생할 수 있는 에러 예방
		return 0;
	}finally {
		if(stack.size() > 0) return 0;		//모든 케이스가 여는 괄호 일 때, ex= {{{{{
	}
	
	return 1;							
}

테스트 케이스 통과

 

반응형