zyeon's 작심삼일 코딩 공부
프로그래머스 C++ [올바른 괄호] 본문
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s | answer |
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
문제 풀이
1. 맨 앞에 '('가 온다.
2.맨 뒤에 ')'가 온다.
3. '('와 ')'의 개수가 같다.
이 문제를 처음 봤을 때 내가 고려한 것들이다.
bool solution(string s)
{
bool answer = false;
int c1 = 0, c2 = 0;
for(int i = 0; i<s.size(); i++){
if(s[i] == '(') c1++;
else c2++;
}
if(s.front() == '(' && s.back() == ')'&& c1 == c2) answer = true;
return answer;
}
따라서 위처럼 코드를 작성했는데, 몇 가지 결과가 틀렸다고 나왔다.
위 코드는 "())(()"와 같은 문자열도 true를 리턴하는 것이었다.
그래서 '('일 때는 카운트를 증가시켜주고, ')'일 때는 카운트를 감소시켜주는 방법을 사용했다.
이러면 카운트가 음수로 내려갈 때 예외가 걸러진다.
#include<string>
#include <iostream>
bool solution(string s)
{
bool answer = true;
int c = 0;
for(int i = 0; i<s.size(); i++){
if(s[i] == '(') c++;
else c--;
if(c < 0) {
answer = false;
break;
}
}
if(c != 0) answer = false;
return answer;
}
같은 방식으로 stack을 사용해 풀 수도 있다.
#include<string>
#include <iostream>
#include <stack>
bool solution(string s)
{
bool answer = true;
stack<char> stack_s;
for(auto& c : s){
if(c == '(') stack_s.push(c);
else {
if(stack_s.empty()) {
answer = false;
break;
}
stack_s.pop();
}
}
if(!stack_s.empty()) answer = false;
return answer;
}
출처: 프로그래머스 코딩 테스트 연습,
'코딩테스트-프로그래머스 > Lv.2' 카테고리의 다른 글
프로그래머스 C++ [멀리 뛰기] (0) | 2024.07.06 |
---|---|
프로그래머스 C++ [다음 큰 숫자] (0) | 2024.06.09 |
프로그래머스 C++ [오픈채팅] (1) | 2024.06.08 |