본문 바로가기

Development

BOJ 10828(스택), 10799(쇠막대기)

10828번: 스택

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

int main(){
	stack<int> st;
	int n, m;
	char tmp[10];
	
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> tmp;
		if(!strcmp(tmp, "push")){
			cin >> m;
			st.push(m);
		}
		else if(!strcmp(tmp, "pop")){
			if(st.size() == 0) cout << -1 << endl;
			else{
				cout << st.top() << endl;
				st.pop();
			}
		} 
		else if(!strcmp(tmp, "size")){
			cout << st.size() << endl;
		} 
		else if(!strcmp(tmp, "empty")){
			if(st.empty()) cout << "1" << endl;
			else cout << "0" << endl;
		} 
		else if(!strcmp(tmp, "top")){
			if(st.size() == 0) cout << -1 << endl;
			else cout << st.top() << endl;
		}
	}
	return 0;
}

스택의 기능을 문제에 맞게 구현하는 문제로 다른 설명은 생략한다.

10799번: 쇠막대기

#include <iostream>
#include <cstring>
#include <stack>
#define N 100000
using namespace std;

int main(){
	stack<int> S;
	char input[N];
	int sum=0;

	cin >> input;

	for(int i=0;i<strlen(input);i++){
		if(input[i] == '('){
			S.push(1);
		}
		if(input[i] == ')'){
			S.pop();
			if(input[i-1] == '('){
				sum+=S.size();
			} else {
				sum+=1;
			}
		}
	}
	cout << sum << endl;
	return 0;

}

쇠막대기와 레이저의 배치를 "()(((()())(())()))(())"와 같은 형식으로 주어진다. 레이저는 "()"로 표시한다. "("과 ")"의 반복적으로 있어서 스택으로 Push, Pop하며 뭔가 알고리즘을 세우면 될 것이라고 생각했다. "("이면 임의의 값을 push하고 ")"이면 pop을하고 레이저로 나뉘어진 쇠막대기의 수를 더한다. 이때, 유의할 점으로 생각한 것은 ')'일 때, 이전 문자가 '(' 일때만 사이즈를 더하는 것으로 코딩했다. 왜냐하면 ')' 이전 문자가 또 ')'일 경우에는 레이저로 나눈것이 아니기 때문이다. 이렇게하면 될 줄 알았는데 원하는 결과값이 안나왔다. 문제의 예시와 비교했는데 쇠막대기의 끝을 표시했을 때, +1을 하면 해결할 수 있을 거라고 생각했다. 그렇게 문제를 해결했다.

 

'Development' 카테고리의 다른 글

BOJ 1316(그룹 단어 체커)  (0) 2021.01.07
BOJ 1577(단어공부)  (0) 2021.01.06
CodeUp 기초100제 (바둑알 십자뒤집기)  (0) 2020.10.18
Win32 API 정리  (0) 2019.03.06
알고리즘 DP 정리  (0) 2019.01.22