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

Doorbals·2023년 1월 7일
0

프로그래머스

목록 보기
5/10

🔗 문제 링크

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


✍️ 문제 풀이

풀고 난 이후에 다른 분들의 풀이를 보니 대부분 스택을 사용하신 걸 알 수 있었다. 내 경우에는 스택을 직접 사용하진 않고 각 괄호별 int형 변수로 스택과 비슷하게 사용했다.

1) 먼저 각 괄호별로 int형 변수(bracket1, bracket2, bracket3)를 마련해 스택을 표시해준다. 여는 괄호일 때 +1, / 닫는 괄호일 때 -1을 해주며, 여는 괄호가 나오기 이전에 닫는 괄호가 먼저 나오면 안 되기 때문에 음수가 되어서는 안 된다. 문자열 전체를 돌았을 때 모든 변수가 0이 되어야 올바른 문자열인 것이다.
2) (문자열 길이)횟수 만큼 문자열을 왼쪽으로 한 칸씩 회전하면서 올바른 문자열인지 확인한다.
3) 올바른 문자열인지 확인할 때는 CheckString 함수에 각 문자열을 인수로 넣어 확인한다.

  • 여는 괄호([, {, ()일 때
    • 괄호별 변수에 +1을 해준다.
    • 해당 괄호 다음에 바로 다른 종류의 닫는 괄호가 나오면 올바르지 않은 문자열이므로 0을 반환한다. (ex. 현재 괄호가 [인데 다음 괄호가 } 또는 )일 때)
  • 닫는 괄호(], }, ))일 때
    • 괄호별 변수에 -1을 해준다.
  • 각 괄호별 변수 중 하나라도 음수가 될 때는 올바르지 않은 문자열이므로 0을 반환한다.
  • 문자열 전체를 돌고 나서 각 괄호별 변수를 확인했을 때 닫혀있지 않은 괄호가 있을 때(== 모든 괄호별 변수 중 하나라도 0이 아닐 때)는 0을 반환하고, 문제 없이 모든 문자열을 돌았다면 1을 반환한다.

4) 회전시킨 모든 문자열을 CheckString에 돌린 후 반환된 값을 count 변수에 누적시켜 이를 최종적으로 반환한다.


🖥️ 풀이 코드

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int bracket1 = 0, bracket2 = 0, bracket3 = 0; // 각 괄호의 스택을 표시하는 정수. 음수로 떨어지면 안됨. 여는 괄호일 때 +1, 닫는 괄호일 때 -1, 
                                              // 문자열 전체 돌았을 때 최종적으로 모든 스택이 0이 되어야 함.

int CheckString(string s) 
{   
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] == '[')
        {   
            bracket1 += 1;

            // 현재 괄호가 여는 괄호인데 다른 종류의 괄호에 의해 바로 닫혀버리면 0 반환
            if (i < s.size() - 1 && (s[i + 1] == '}' || s[i + 1] == ')'))
                return 0; {(})
        }
        else if (s[i] == ']')
        {
            bracket1 -= 1;
        }
        else if (s[i] == '{')
        {
            bracket2 += 1;

            if (i < s.size() - 1 && (s[i + 1] == ']' || s[i + 1] == ')'))
                return 0;
        }
        else if (s[i] == '}')
        {
            bracket2 -= 1;
        }
        else if (s[i] == '(')
        {
            bracket3 += 1;

            if (i < s.size() - 1 && (s[i + 1] == ']' || s[i + 1] == '}'))
                return 0;
        }
        else if (s[i] == ')')
        {
            bracket3 -= 1;
        }

        // 각 괄호 스택 중 하나라도 음수가 되면 바로 0 반환
        if (bracket1 < 0 || bracket2 < 0 || bracket3 < 0)
            return 0;
    }
    // 마지막에 확인 했을 때 닫혀있지 않은 괄호가 있을 때는 0 반환 / 문제 없이 모든 문자열을 돌았다면 1 반환
    if (bracket1 == 0 && bracket2 == 0 && bracket3 == 0)
        return 1;
    else
        return 0;
}

int solution(string s) {
    string str = s;
    int count = 0;
    int sLen = s.size();

    for (int i = 0; i < sLen; i++)
    {
        count += CheckString(str);
        str = str.substr(1, sLen - 1) + str.substr(0, 1);  //  왼쪽으로 한 칸씩 회전   
        bracket1 = 0, bracket2 = 0, bracket3 = 0;
    }
    return count;
}
profile
게임 클라이언트 개발자 지망생의 TIL

0개의 댓글