문제
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
제한조건
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예시
a | answer |
"()()" | 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);
}
}
[성공]
프로그래머스에서 문제 확인