Home [Lv.2] 올바른 괄호
Post
Cancel

[Lv.2] 올바른 괄호

문제 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한조건
  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예시
aanswer
"()()"true
"(())()"true
")()("false
"(()("false

C#

괄호가 올바르게 매칭 되는지 확인해야하니까 stack 구조를 이용해서 (면 push하고, )면 pop을 해서 비교하도록 함. 정규식을 이용해 자르면 괄호를 기준으로 쉽게 자를 수 있을 것 같아서 정규식을 활용함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Solution
{
	public bool solution(string s)
	{
		string openBracket = "(";
		string closeBracket = ")";

		var brackets = Regex.Matches(s, @"\(|\)");

		if (brackets.Count > 0)
		{
			Stack<string> stack = new Stack<string>();

			foreach (Match bracket in brackets)
			{
				if (openBracket == bracket.Value)
				{
					stack.Push(bracket.Value);
				}
				else if (closeBracket == bracket.Value)
				{
					if (stack.Count == 0)
						return false;

					if (stack.Pop() != openBracket)
					{
						return false;
					}
				}
			}

			return (stack.Count == 0);
		}
		return false;
	}
}

[실패] 정확성은 통과했지만 효율성에서 실패로 나옴

효율성 높아지도록 수정

  • 괄호로만 이뤄져 있으니 굳이 정규식으로 자를 필요 없이 문자 배열로 확인하도록 함
  • 괄호의 종류가 한개니까 굳이 스택을 이용할 필요 없이 (면 1증가, (면 1 감소와 같은 방법 해결 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Solution
{
	public bool solution(string s)
	{
		char open = '(';
		char close = ')';

		char[] brackets = s.ToCharArray();

		int openCnt = 0;
		
		foreach (char item in brackets) 
		{
			if (open == item)
			{
				openCnt++;
			}
			else if (close == item)
			{
				if (openCnt == 0)
					return false;

				openCnt--;
			}
		}
		return (openCnt == 0);
	}
}

[성공]

프로그래머스에서 문제 확인

This post is licensed under CC BY 4.0 by the author.