seunghyun Note

[프로그래머스] - 괄호 회전하기 with Java 본문

코딩테스트/백준

[프로그래머스] - 괄호 회전하기 with Java

승숭슝현 2024. 1. 6. 21:42

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. 스택으로 문제를 해결하기

2. 열리는 괄호는 3종류이다. '[' , '(', '{' 로 구성되어 있고 닫는 괄호와 짝을 맞춰야 한다.

3.  일단 stack이 empty 일 경우에는 push를 한다.

4. 처음 스택을 peek 했을 때 다음 값이 닫는 괄호일 경우에는 pop을 해준다.

결국 우리는 [] () {} 일때 pop을 해서 stack 을 empty로 바꾸는게 목적이다.

stack이 empty가 된다면 순서와 상관없이 짝을 다 맞춘 것이다. 

 

하지만 이 문제는 간단한 스택으로만 해결하는 것이 아닌 회전이다.

이 문제를 풀기 전에 회전 문제를 풀 때 내 머리가 돌아갈거 같았는데 회전은 결국 index에 변화를 주는 것이다.

그냥 index를 처리하게 된다면 -1, 또는 문자열의 크기보다 클 수 있기 때문에 

만능 소스인 (index+cnt) % string.length()를 추가 해준다.

cnt를 추가해주고 문자열의 크기로 나눠준다면 초과하거나 -1이 될 수가 없다.

이렇게 회전을 시키면 문제를 해결하기에 매우 용이하다.

 

import java.util.Stack;

class Solution {
	public int solution(String s) {

		int count = 0;
		char data = 0;
		for (int cnt = 0; cnt < s.length(); cnt++) {
			Stack<Character> stack = new Stack<Character>();
			for (int i = 0; i < s.length(); i++) {
				data = s.charAt((i + cnt) % s.length());
				if (stack.isEmpty()) {

					stack.push(data);
				} else if (stack.peek() == '[' && data == ']') {
					stack.pop();
				} else if (stack.peek() == '(' && data == ')') {
					stack.pop();
				} else if (stack.peek() == '{' && data == '}') {
					stack.pop();
				} else
					stack.push(data);

			}

			if (stack.empty())
				count++;

		}

		return count;
	}
}

 

9점짜리라고..?!

 

왜 9점인지는 모르겠지만 문제를 풀면서 재미를 느꼈다.

728x90