본문 바로가기
알고리즘

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

by 육빔 2024. 8. 8.
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

 

전에 풀었던 올바른 괄호하고 비슷한 매커니즘 사용해서 푸는 문제

하지만 다른점은 ()로 한정된 것이 아니고 {}, [], () 이렇게 3가지 괄호의 종류가 있으므로 해쉬맵에 저장해놓고 시작한다.

그 다음은 코딩테스트 합격자 되기 : 자바편을 보면서 놀랐던 점인데 단순하게 문자열을 한 번 더 붙여서 for문으로 돌림으로써 회전하는 것을 단순하게 돌리는 걸로 구현한 점에서 감탄하엿다.

그 후는 똑같이 ArrayDeque에 넣어서 비교하면서 pop 시키고 최종으로 stack이 비어있으면 answer을 올라가는 형태로 구현 

 

배운점

for문앞에 단순 변수를 넣어서 continue할때 특정 for문을 지목하여 넘길 수 있는 사실.

String의 각각에 요소에 접근하기 위해 s.charAt(인덱스번호)를 넣어서 접근 가능.

 

코드

import java.util.*;
class Solution {
    public int solution(String s) {
        HashMap<Character, Character> map = new HashMap<>();
        
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
        
        int n = s.length();
        s+=s;
        int answer = 0;
        
        A:for(int i=0; i<n; i++){
            ArrayDeque<Character> stack = new ArrayDeque<>();
            
            for(int j=i; j<i+n; j++){
                char c = s.charAt(j);
                
                if(!map.containsKey(c)){
                    stack.push(c);
                }else{
                    if(stack.isEmpty() || !stack.pop().equals(map.get(c))){
                        continue A;
                    }
                }   
            }
            if(stack.isEmpty()){
                    answer++;
                }
        }
        return answer;
    }
}

 

완성

728x90
반응형