프로그래머스 괄호 회전하기

박철현·2023년 11월 27일

프로그래머스

목록 보기
65/80

프로그래머스 - 괄호 회전하기

import java.util.Arrays;
import java.util.Stack;

class Solution {
	public int solution(String s) {
		// 1. 올바른 괄호 형태인지 확인
		// 2. 문자열 회전후 반복
		// 여는 괄호 나오면 stack에 넣기, 닫는 괄호 나오면 마지막 것이 같은쌍인지 확인
		int count = 0;

		for (int i = 0; i < s.length()-1; i++) {
			// 올바른 괄호 형태인지 확인
			if (checkCorrect(s)) {
				count++;
			}
			// 회전 시킨 s로 갱신
			s = circleLeftString(s);
		}

		return count;

	}

	private String circleLeftString(String s) {
		char[] sToCharArr = s.toCharArray();
		String transStr = String.valueOf(Arrays.copyOfRange(sToCharArr, 1, sToCharArr.length)) + sToCharArr[0];
		return transStr;
	}

	private boolean checkCorrect(String s) {
		Stack<Character> stack = new Stack<>();

		for (int i = 0; i < s.length(); i++) {
			char target = s.charAt(i);
			if (target == '(' || target == '{' || target == '[') {
				stack.push(target);
			} else {
				// 닫는 괄호인데 스택에 현재 아무것도 없다
				if (stack.isEmpty()) {
					return false;
				}
				char inStackChar = stack.peek();

				switch (target) {
					case ')' -> {
						if (inStackChar != '(') {
							return false;
						}
						stack.pop();
					}
					case '}' -> {
						if (inStackChar != '{') {
							return false;
						}
						stack.pop();
					}
					default -> {
						if (inStackChar != '[') {
							return false;
						}
						stack.pop();
					}
				}
			}
		}
        // 모두 여는 괄호만 있을 경우 else 문이 실행이 안되니 pop이 안됨
        // 따라서 size를 실제로 검사 해줘야 함
        if(stack.size() !=0) {
			return false;
		}
		return true;
	}
}
  • 전체 과정

    • 문자열 s가 적합한 괄호인지 확인
    • 왼쪽으로 한칸 회전시키고 같은지 확인
    • 동일한 문자s로 끝나면 종료
  • 괄호를 쓴다고 하면 동일한 괄호가 열렸으면, 동일한 괄호로 닫혀야 한다.

    • (가 나오면 )가 나와야 함
    • 아무리 섞이더라도 동일
    • ({[]}) 이런식으로 봐도 동일한 괄호로 닫혀야 함
  • 여는 괄호가 나오면 stack에 넣고, 빼는거 나오면 같은종류인지 확인하고 뺌

  • 이 과정을 n-1번 반복

    • ex) "abc" 문자 왼쪽 회전
      • abc -> bca -> cab -> abc(원점)
      • 이거와 동일하게 주어진 문자열에서 괄호 볼 경우는 3번뿐
      • 0 ~ n-1까지 돌게끔
  • 하지만 닫는 괄호 종류까지만 보는 것이 아닌 마지막에 stack의 size도 검사해야 함

    • ((( 처럼 여는 괄호만 나올 경우 else문에 걸려 pop되는 경우가 없이 true로 반환됨
    • 따라서 마지막에 size 검사 필요
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글