개발 지식 공유, 복습

백준 - 4949(균형잡힌 세상) C++ 본문

알고리즘(백준)

백준 - 4949(균형잡힌 세상) C++

like_sonny 2021. 12. 25. 22:57

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

이번 문제는 괄호가 각 줄마다 올바르게 입력되어 있는지 판별하는 문제이다.

 

여기서 저는 문장을 입력받는 것을 string 헤더를 이용해 string 형으로 받았고 원래대로 cin을 통해 입력을 받는다면 띄어쓰기가 된 지점까지만 인식한다.

그래서 getline함수를 이용해 띄어쓰기는 포함하고 다음 줄이 나오기 전까지 즉, 한 문장을 입력받았습니다. 사용 예는 다음과 같다.

#include <string>
#include <iostream>
int main(){
    string data;
    // 띄어쓰기를 포함해서 \n이 나올때까지를 한번에 입력받게 함
    getline(cin, data);
}

한 문장을 입력받았으면, 지금부터 스택(stack)을 이용해 풀어갈 것이다.

 

해당 글자가 괄호가 아닌 경우는 그냥 스킵하고 여는 괄호('[', '(', '{')라면 스택에 추가하고, 이에 상응하는 닫는 괄호(']', ')', '}')라면 스택의 가장 위에 있는(stack.top()) 괄호를 파악해 맞으면 이를 제거한다.

 

이에 상응하지 않는 괄호거나 스택이 비어있다면, 괄호가 올바르게 배치되지 않았다는 뜻이므로 더 이상 작동할 필요 없이 반복문을 탈출해 괄호가 올바르게 배치되지 않은 문장이라고 판단한다.

 

코드는 다음과 같다.

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

int main()
{

  freopen("input.txt", "rt", stdin);
  string data;
  while (true)
  {
    // 띄어쓰기를 포함해서 \n이 나올때까지를 한번에 입력받게 함
    getline(cin, data);

    if (data == ".")
      break;

    stack<char> s;
    bool flag = true;

    for (int i = 0; i < data.length(); i++)
    {
      if (data[i] == '[' || data[i] == '(')
        s.push(data[i]);

      else if (data[i] == ']')
      {
        if (!s.empty() && s.top() == '[')
          s.pop();
        else
        {
          flag = false;
          break;
        }
      }

      else if (data[i] == ')')
      {
        if (!s.empty() && s.top() == '(')
          s.pop();
        else
        {
          flag = false;
          break;
        }
      }
    }
    if (s.empty() && flag == true)
      printf("yes\n");
    else
      printf("no\n");
  }
  return 0;
}

통과 기록

 

'알고리즘(백준)' 카테고리의 다른 글

백준 - 1837(암호제작) C++  (0) 2022.01.14
백준 - 11866(요세푸스 문제0) C++  (0) 2021.12.26
백준 - 2108(통계학) C++  (0) 2021.12.21
백준- 1920(수 찾기) C++  (0) 2021.09.01
백준 - 11651(좌표 정렬하기 2) C++  (0) 2021.08.31