본문 바로가기
PS/프로그래머스

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

by Jman 2022. 7. 15.

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;
    }
}