비트를 쪼개는 개발자

allen321@naver.com

코딩테스트

C# [프로그래머스] Lv.2 괄호 회전하기

MozarTnT 2024. 9. 16. 20:09
728x90
반응형

 

 

 

 

 

 

 

 

문제 설명

 

괄호 회전하기 라는 제목이여서 문제를 처음에 잘못 접근했었다.

 

사실 괄호를 회전하는게 아니라 문자열로 받아온 괄호의 순서를 하나씩 앞으로 당긴다고 생각하고 문제를 접근해야 한다.

 

s라는 문자열로 여러가지 모양의 괄호가 담긴 문자열을 분석해서 각 괄호가 모두 짝이 맞는 모양인지 검사해야 한다.

 

만약 "[ , ] , ( , ) , { , } "이런 문자열이라면 각각 모두 괄호가 짝을 이뤘으므로 올바른 괄호가 완성되었다고 판단한다.

 

또한 괄호와 괄호 사이에 " { , [ , ] , }" 이런식으로 첫 괄호와 다른 모양의 괄호가 완성된 형태로 남아있고 완성시킬 수 있다면 이 또한 올바른 괄호로 판단한다.

 

즉 "올바른 괄호 문자열"이란 사용된 모든 괄호가 제대로 짝을 이룬 문자열인지를 검사하라는 뜻이다.

 

이렇게 문자열을 하나씩 열심히 당겨서 총 몇개의 올바른 괄호 문자열이 완성되는지 return 하면 되는 문제다.

 

 

해당 코드

 

using System;
using System.Collections.Generic;

public class Solution
{
    public int solution(string s)
    {
        int n = s.Length; 
        int perfectCount = 0; // 올바른 괄호 문자열이 되는 경우의 수를 저장할 변수
        
        for (int i = 0; i < n; i++) // 문자열 길이만큼 반복
        {
            if (IsPerfectBracket(s)) // 올바른 괄호 문자열 검사
            {
                perfectCount++; // 
            }
           
            s = MoveNext(s); // 문자열을 이동
        }
        
        return perfectCount; // 올바른 괄호 문자열 반환
    }
    
    private string MoveNext(string s) // 문자열 이동 함수
    {
        int n = s.Length;
        char[] moved = new char[n]; // 문자열을 저장할 배열
        
        for (int i = 1; i < n; i++) // 첫 문자를 제외한 문자들을 앞으로 이동
        {
            moved[i - 1] = s[i]; // i번째 문자를 새로운 배열의 (i-1)번째 위치에 저장
        }
        moved[n - 1] = s[0]; // 첫 번째 문자를 배열의 마지막 위치에 저장
        
        return new string(moved); // 회전된 문자열을 반환
    }
    
    private bool IsPerfectBracket(string s) // 올바른 괄호 검사 함수
    {
        Stack<char> stack = new Stack<char>(); // 괄호의 짝을 확인하기 위한 스택
        
        for (int i = 0; i < s.Length; i++) 
        {
            char c = s[i]; // 현재 문자를 c에 저장
            if (c == '(' || c == '[' || c == '{') // 현재 문자가 열린 괄호 중 하나라면
            {
                stack.Push(c); // 스택에 현재 문자를 추가
            }
            else // 현재 문자가 닫힌 괄호 중 하나라면,
            {
                if (stack.Count == 0) return false; // 스택이 비어있으면 짝이 맞지 않으므로 false
                char top = stack.Pop(); // 스택의 맨 위에 있는 문자를 꺼냄
                
                if ((c == ')' && top != '(') || // 닫힌 괄호가 짝이 맞지 않으면,
                    (c == ']' && top != '[') ||
                    (c == '}' && top != '{'))
                {
                    return false; // false를 반환
                }
            }
        }
        
        return stack.Count == 0; // 모든 검사후 스택이 비어있다면 true를 반환, 올바른 괄호 문자열
    }
}

 

 

 

풀이 방법

 

main문 하나에서 처리하기에는 코드가 너무 길어져서 각 기능을 담당하는 함수를 나눠 주었다.

 

"문자열을 한칸식 당겨주는 함수"와 "올바른 괄호 문자열인지 검사하는 함수"를 각각 통과시키고 최종적으로 몇개의 올바른 괄호 문자열이 되었는지 검사한다.

 

문자열을 당겨주는 함수는 간단하게 문자열 순서를 바꿔주는 방식으로 구현했고,

 

올바른 괄호인지 검사하는 함수는 스택을 활용해서 각 괄호를 검사했다.

 

검사 도중 스택에서 괄호를 꺼내 짝이 맞지 않거나 스택이 비어있으면 false를 반환하고

 

모든 검사를 통과하면 true를 반환한다.

 

 

 

 

728x90
반응형