문제

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

 

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

풀이

초반부터 설계를 제대로 하고 풀지 않아서 오래 걸렸다. 

쉽게 금방 풀릴줄알아서 바로 코드에 들어간 게 문제였다. 

 

신경 써야 할 점은

 

1. 공백 또한 입력받아야 한다. (string 헤더의 getline() 사용 필요 )

2. 스택의 경우의 수를 모두 생각 ->  ')' or ']'가 등장하였을 때 스택에 문자가 있긴 한지, 있다면 그사이 문자열 또한 균형이 잡혀있는지 판단하여야 한다.

 

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<stack>
using namespace std;
string arr;
stack<char> st;
vector<bool> result;
int main() {


	while (1) {
		bool flag = false;
		
			//<srting> 헤더의 getline()을 활용한 공백문자 입력 포함 , 개행(enter)까지 문자를 받음 
			
			getline(cin, arr);
			
			
		if (arr.size() == 1 && arr[0]=='.') break; //종료조건

		for (int i = 0; i < arr.size(); i++) {

			if (arr[i] == '(' || arr[i] == '[') st.push(arr[i]);
			
			if (!st.empty()) { 
				if (arr[i] == ')' && st.top() == '(') {
					st.pop();
				}
				else if (arr[i] == ']' && st.top() == '[') {
					st.pop();
				}
				else if (arr[i] == ')' && st.top() != '(') {
					flag = true;
					break;
				}
				else if (arr[i] == ']' && st.top() != '[') {
					flag = true;
					break;
				}
			}
			else { //비었을때
				if (arr[i] == ')' || arr[i] == ']') {
					flag = true;
					break;
				}
			}

		
			

		}

		if (st.size() == 0 && flag == false) result.push_back(true);
		else result.push_back(false);

		//다음을 위해 스택,문자열비우기 

		while (!st.empty()) {
			st.pop();
		}
		arr.clear();

	}

	for (int j = 0; j < result.size(); j++) {
		if (result[j] == true) cout << "yes" << endl;
		else cout << "no" << endl;
	}

	return 0;
}

문제

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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

풀이

스택을 안 쓰고, NO과정을 생각하다가 괜히 복잡하게 풀고 있었다. 그냥 스택 생성 후 , cnt 변수를 지정해서 스택 쌓고, 빼고 하면 되는 간단한 문제였다. 

 

이런 쉬운문제는 쉽고 빠르게 푸는 연습이 코딩 테스트에서 더 중요하다고 생각한다....

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int N;
vector<char> result;
int main() {
	cin >> N;
	stack<int> st; //스택만들어서 되는지 안되는지 확인
	bool flag = false;
	int cnt = 1; // 스택 1부터 시작


	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;		

		while (cnt <= a) { // 지정된 수 까지 cnt 쌓기 
			st.push(cnt); 
			cnt++;
			result.push_back('+');
		}
		if (st.top() == a) {
			st.pop();
			result.push_back('-');

		}
		else {

			flag = true;
			break;
		}

	}
	if (flag == true) cout << "NO" << endl;
	else {
		for (int k = 0; k < result.size(); k++) {
			cout << result[k] << '\n';

		}
	}




	return 0;
}

'알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 영화감독 숌 (1436 / C++)  (0) 2022.01.13
[백준] 랜선자르기 (1654 / C++)  (0) 2022.01.11
[백준] 단어정렬 (C++/1181)  (0) 2021.12.19
[백준] 보물섬 (2589/C++)  (0) 2021.08.22
[백준] DFS와 BFS (1260/C++)  (0) 2021.08.19

www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

코드 설명 

string배열과 stack을 이용하여 풀이하였다. 스택+ 제약조건을 걸어주면 금방 풀린다.

처음에 제약조건을 단순히 top과 들어오는 값과 다르면 pop으로 제거해줬는데 그러면 당연히 예외케이스가 생긴다

(2번case)

 

문제읽고 알고리즘생각하고 설계해본후 예외케이스 없는지 꼭 다시 확인해보자 !

 

코드

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int N;
int check[100];

int main() {
	cin >> N;
	string abc;
	for (int i = 0; i < N; i++) {
		cin >> abc;
		stack<char> st;
		for (int j = 0; j < abc.size(); j++) {
			if (!st.empty())
			{
				if (st.top() == '(' && abc[j] == ')')
					st.pop();
				else st.push(abc[j]);
			}
			else st.push(abc[j]);
		}
		if (st.empty()) check[i] = 1;
		else check[i] = 2;

		
	}
	for (int i = 0; i < N; i++) {
		if (check[i] == 1) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	


	return 0;
}

'알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 촌수계산  (0) 2021.05.04
[백준] 단지번호붙이기  (0) 2021.05.02
[백준] 문자열  (0) 2021.05.02
[백준] 섬의 개수  (0) 2021.04.28
[백준] 바이러스  (0) 2021.04.27

+ Recent posts