🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/Programmers

[프로그래머스/Programmers] 괄호 회전하기 (Java - Stack - Lv2)

JONG_UK 2023. 1. 18. 10:44
728x90
반응형
SMALL

 

 

프로그래머스

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

programmers.co.kr


⭐️ 코드

import java.util.ArrayDeque;

public class PL2_5 {
    // 괄호 회전하기
    public int solution(String s) {
        int answer = 0;
        // 길이가 홀수일 때 괄호 만들어 지지 않음
        if (s.length() == 1 || s.length() % 2 != 0) {
            return 0;
        }
        // 문자열 회전
        for (int i = 0; i < s.length(); i++) {
            // 괄호 확인
            if (confirmStr(s)) {
                answer++;
            }
            // 회전
            s = s.substring(1, s.length()) + s.substring(0, 1);
        }
        return answer;
    }

    private boolean confirmStr(String s) {
        ArrayDeque<Character> stack = new ArrayDeque<>();
        char[] c = s.toCharArray();
        for (char item : c) {
            if(stack.isEmpty()) {
                stack.addLast(item);
                continue;
            }
            if (item == '[' || item == '{' || item == '(') {
                stack.addLast(item);
            } else if (item == ']' && stack.peekLast().equals('[')) {
                stack.pollLast();
            } else if (item == '}' && stack.peekLast().equals('{')) {
                stack.pollLast();
            } else if (item == ')' && stack.peekLast().equals('(')) {
                stack.pollLast();
            } else {
                return false;
            }
        }
        return stack.isEmpty() ? true : false;
    }

💡 문제 풀이

올바른 괄호 문제처럼 이 문제도 Stack을 활용해서 푸는 문제다. 다만 괄호 종류가 다양해지고 회전한다는 개념이 포함됐을 뿐이다.

문자열을 왼쪽으로 회전시킨다는 개념이 처음엔 잘 이해가 가지 않았지만 아래의 포문 내의 코드처럼 문자열의 1번 index 요소부터 끝까지와, 문자열의 0번 index 요소를 맨 뒤에 잘라 붙이면 회전이 된다.

s = s.substring(1, s.length()) + s.substring(0, 1);

우리는 문자열 괄호가 제대로 된 것인지 찾아서 answer 개수를 올려줘야 한다. 그래서 아래 함수를 하나 만들었다.

if (confirmStr(s)) {
    answer++;
}
private boolean confirmStr(String s) {
    ArrayDeque<Character> stack = new ArrayDeque<>();
    char[] c = s.toCharArray();
    for (char item : c) {
        if(stack.isEmpty()) {
            stack.addLast(item);
            continue;
        }
        if (item == '[' || item == '{' || item == '(') {
            stack.addLast(item);
        } else if (item == ']' && stack.peekLast().equals('[')) {
            stack.pollLast();
        } else if (item == '}' && stack.peekLast().equals('{')) {
            stack.pollLast();
        } else if (item == ')' && stack.peekLast().equals('(')) {
            stack.pollLast();
        } else {
            return false;
        }
    }
    return stack.isEmpty() ? true : false;
}

함수를 보면 그냥 쉽게 올바른 괄호 문제처럼 풀었다. 

대신 '[ , { , ('로 시작했다면 꼭 닫히는 날이 올 텐데, 마지막에서 닫힐 땐 가장 나중에 push 된 괄호와 동일한 형태의 괄호로 닫혀야 한다. 따라서 첫 번째로 닫히지 않거나 그다음에 닫히지 않는다면 바로 false를 return 해 준다.

비어있을 때 poll을 할 수 없기 때문에 꼭 isEmpty() 메소드를 통해 조건을 설정해 주자!!!

 


👀 후기

그냥저냥 어렵진 않지만 뭔가 어렵다..

처음부터 stack을 통해 회전시켜서 바로 찾는 방법은 없을까???

728x90
반응형
LIST