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

allnight5·2023년 4월 7일
0

프로그래머스

목록 보기
59/73

첫번째 Map을 활용한 카운트

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        Map<Character, Integer> map = new HashMap<>();
        String new_s = "";
        for(int i=0; i<s.length(); i++){
            map.put('[',0);
            map.put('{',0);
            map.put('(',0);
            int open =0;
            new_s = s.substring(i, s.length())+ s.substring(0, i);
            for(char c : new_s.toCharArray()){ 
                if(c == '[' || c == '{' || c == '('){                    
                    map.put(c, map.get(c)+1);
                }else{
                    if(c == ']') c= '[';
                    else if(c == '}') c ='{';
                    else c ='(';
                    if(map.get(c) == 0){
                        open = -1;
                        break;
                    }
                    map.put(c, map.get(c)-1);
                } 
            } 
            if(open == 0){ 
                answer += 1;
            }
        }
        return answer;
    }
}

{ ( { ) } }
이런식이 가능 하다고 생각하여 맵으로 만들었으나 조건을 잘못줘서 실패함

고민해보니
{ ( [ ] ) }
무조건 열면 다음걸로 닫아야 하는게 괄호임
그러면 순서대로 넣고 앞에것만 확인하면 되니 스택임
그래서 스택을 사용하기로 함

두번째 Stack 활용으로 성공

import java.util.Stack; 
class Solution {
    public int solution(String s) { 
        int answer =0;
        String new_s = "";
        for(int i=0; i<s.length(); i++){  
            new_s = s.substring(i, s.length())+ s.substring(0, i);
            if(check(new_s)){
                answer+=1;
            }
        }
        return answer;
    }
    private boolean check(String s){
        Stack<Character> stack = new Stack<>();
        
        for(char c : s.toCharArray()){
            
            if(c == '[' || c =='{' || c == '('){
                stack.push(c);
            }else{
                if(!stack.isEmpty()){
                    switch(c){
                        case ']':
                            if(stack.peek() == '['){
                                stack.pop();
                            }
                            break;
                        case ')':                            
                            if(stack.peek() == '('){
                                stack.pop();
                            }
                            break;
                        case '}':
                            
                            if(stack.peek() == '{'){
                                stack.pop();
                            }
                            break; 
                    }
                }else{
                    stack.push(c);
                    break;
                }
            }
        }
        return stack.isEmpty();
    } 
}
profile
공부기록하기

0개의 댓글