PS/프로그래머스
[프로그래머스 *Java] - 괄호 회전하기
후추부
2022. 7. 15. 19:02
https://school.programmers.co.kr/learn/courses/30/lessons/76502
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건
제한시간 : 40분 이내
시간 내에 푼 문제입니다.
로직은 전체적으로 두 가지로 나눌 수 있었습니다.
1. 왼쪽으로 shift 하면서 shift 한 값을 다시 문자열 끝에 붙여주는 작업,
2. shift 문자열을 가지고 올바른 괄호인지 판별
괄호 종류가 총 세 가지라, 괄호 쌍을 맞추게 된 건 집어 넣지 않고 pop() 하는 과정이 있는데,
그 부분은 HashMap 자료구조를 이용해서 괄호 자료를 미리 넣어두고 containsKey() 하는 식으로 처리했습니다.
import java.util.*;
class Solution {
HashMap<Character, Character> parenthesis = new HashMap<>();
public void init() {
parenthesis.put('{', '}');
parenthesis.put('(', ')');
parenthesis.put('[', ']');
}
public boolean isCorrectParenthesis(String s) {
char c = s.charAt(0);
if(c == ']' || c == '}' || c == ')') return false;
Stack<Character> stk = new Stack<>();
stk.push(c);
for (int i = 1; i < s.length(); i++) {
char target = s.charAt(i);
if(stk.isEmpty()) {
stk.push(target);
continue;
}
char topParenthesis = stk.peek();
if(parenthesis.containsKey(topParenthesis)) {
if(parenthesis.get(topParenthesis) == target) {
stk.pop();
continue;
}
}
stk.push(target);
}
if(stk.isEmpty()) return true;
else return false;
}
public int solution(String s) {
int count = 0; // 올른 괄호 문자열인 경우를 찾을 경우 +1
StringBuilder sb = new StringBuilder();
int len = s.length();
init();
for (int i = 0; i < len; i++) {
sb.append(s.substring(1, len)).append(s.substring(0, 1));
s = sb.toString();
sb.setLength(0);
if(isCorrectParenthesis(s)) {
count++;
}
}
return count;
}
}