본문 바로가기

알고리즘/[프로그래머스]Lv.2

[프로그래머스]Lv2. 올바른 괄호

본 페이지는 C++ 독학을 위해 작성한 포스트입니다 풀이과정도 포함되어있지만 문법공부에 대한 비중이 있습니다.
(+  Java언어 내용도 포함되어있습니다. )

 

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

 

프로그래머스

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

programmers.co.kr

 

1.문제설명


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

-제한사항문자열 s의 길이 : 100,000 이하의 자연수문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

2. 문제해결 접근

  • 괄호는 반드시 '('여는괄호와 ')' 닫는 괄호가 한쌍을 이루어야 한다 
  • 반복문을 사용해 문자열을 검사한다 문자열은 charAt();를 이용한다.  
  • 다시말해, 여는괄호와 닫는괄호의 차는 0이다. - 횟수를 담는 변수 cnt를 지정하여, 해당 문자가 나올때마다 횟수가 증감된다.
  • 닫는괄호는 여는괄호보다 먼저 나올 수 없다. - 닫는괄호가 먼저 나올경우, 반복문을 빠져나간다. 
  • 여는괄호'('가 여러번 나오더라도 닫는 괄호')'가 갯수에 맞게 나오면 된다.

 

3.답안 : [언어 : java]

class Solution {
    boolean solution(String s) {
        // answer 초기값은 boolean으로 지정한다
		 boolean answer = false;
		 int count = 0;
		 // 반복문으로 문자열 s의 전구문을 확인하고 (charAt(i)으로 한글자씩 뽑아낼 수 있다.)
		 // 만약 ( 가 확인되면 count++
		 // 만약 ) 가 확인되면 count--
		 // count == 0 이면 answer = true;로 바꿔서 반환한다.
		 
		 for (int i = 0; i < s.length(); i++) {
			 if( s.charAt(i) == '(' ) count++;
			 else if( s.charAt(i) == ')') count--;
			 if(count <0)break;
		}
		if(count == 0) answer = true;
		 System.out.println( count );
		 
		 return answer;
    }
}

 

4. C++ 답안

출제의도는 스택을 사용하는 문제이다.

#include<string>
#include <iostream>
#include <stack>
using namespace std;

bool solution(string s)
{
    bool answer = true;
    // 스택을 생성한다.
    stack <char> st;
    for(int i =0; i < s.size(); i ++){
        // 여는괄호일경우 스택에 값을 저장한다 (push())
        if(s[i]== '(') st.push(s[i]);
        // 닫는괄호일경우, 
        else if(s[i]==')'){
        	//스택이 비어있거나, 스택 최상단에 여는괄호가 아닐경우, false를 반환하고 반복문을 빠져나간다
            if(st.empty() || st.top()!='('){
                answer = false; break;
            }
            st.pop();
        }
    }
    if(!st.empty()) answer =false;
    return answer;
}

 

5. C++ 문법 설명과 표현법

 

스택(stack)

 

https://hirodevelodiary.tistory.com/138