알고리즘/프로그래머스

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

lheunoia 2023. 4. 6. 18:44

 

 

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

이번 문제는 구현 문제였습니다.

 

 

 

 

 

 

📝 문제 풀이

1. 배열의 인덱스를 나머지로 생각하여 s를 왼쪽으로 한 칸 회전 (처음에는 s 그대로) ⭐️

2. 한 칸 회전된 괄호 문자열이 올바른 괄호 문자열인지 확인 (isCorrect 함수 호출)

  • 여는 괄호((또는 [ 또는 {)이면 -> 스택에 push ({{{ 같은 경우를 위해서 bool 타입의 변수 사용)
  • 닫는 괄호이면 -> 스택의 마지막 값이 같은 종류의 여는 괄호라면 pop
  • 스택이 비어있고 한 번이라도 push 된 적이 있으면 true 반환

3. 반환 값이 true이면 answer 1 증가

 

 

 

 

 

👩🏻‍💻 C++ 코드

#include <string>
#include <vector>
#include <stack>

using namespace std;

bool isCorrect(string tmp) {
    stack<char> st;
    bool isPushed = false;
    
    for (auto c: tmp) {
        if (c == '(' || c == '[' || c == '{') {
            st.push(c);
            isPushed = true;
        } else if (c == ')') {
            if (!st.empty() && st.top() == '(') st.pop();
        } else if (c == ']') {
             if (!st.empty() && st.top() == '[') st.pop();
        } else {
             if (!st.empty() && st.top() == '{') st.pop();
        }
    }
    
    if (st.empty() && isPushed) return true;
    return false;
}

int solution(string s) {
    int answer = 0;

    for (int i=0; i<s.length(); i++) {
        string tmp = " ";
        
        // s를 왼쪽으로 한칸 회전
        for (int j=i; j<i+s.length(); j++)
            tmp += s[j % s.length()];
        
        if (isCorrect(tmp)) answer += 1;
    }
    
    return answer;
}

 

 

프로그래머스 - 결과 화면

 

 

 

 

 

반응형