반응형

문제링크:https://www.acmicpc.net/source/10245386

 

로그인

 

www.acmicpc.net

 

스택을 이용한 구현문제였습니다. 

예외처리때문에 애먹은 문제입니다.

 

우선 올바른 괄호열인지 구분하기 위해서 스택을 사용합니다.

스택을 사용하여 올바른 괄호열인지 구분하는 것은 쉽게 하실거라고 생각합니다. 

 

문제는 괄호의 점수계산입니다.

 

이러한 조건을 가지고 있습니다.

각각의 괄호안에 들어갈 때 값이 커집니다. 

2(2+(3x3)) +2(3) 입니다. 즉 2X2 + 2X3X3 + 2X3 =28 입니다.

 

  • 문자열을 검사하며 '(' 라면 스택에 넣습니다. TEMP 값에 2를 곱합니다. 
  • 문자열을 검사하며 '[' 라면 스택에 넣습니다. TEMP 값에 3을 곱합니다. 
  • 문자열을 검사하며 ')' 라면 스택을 확인해 값을 연산이 되는 확인합니다.
  • 연산이 된다면 값을 RESULT에 추가하고 스택을 POP하며 TEMP값도 나누기 2 합니다. 
  • ']' 도 마찬가지의 방식입니다.

만약 스택에 값이 남아있다면 올바르게 괄호 검사 상태가 아니기 때문에 0을 출력합니다. 

 

정답코드입니다. 다양한 예외사항이 있었습니다. 

 

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

string input;
deque <char> arr;
int temp = 1;
int result = 0;
int main() {

	cin >> input;

	for (int i = 0; i < input.size(); i++) {
		if (input[i] == '(') {
			arr.push_back('(');
			temp *= 2;
		}
		else if (input[i] == '[') {
			arr.push_back('[');
			temp *= 3;
		}
		else if (input[i] == ')' && i>0) {
			if (input[i - 1] == '(') {
				arr.pop_back();
				result += temp;
				temp /= 2;			
			}
			
			else if (arr.empty() != 1){
				if (arr.back() == '(') {
					arr.pop_back();
					temp /= 2;
				}
			}
			else{
				cout << 0 << '\n';
				return 0;
			}

		}
		else if (input[i] == ']' && i > 0 ) {
			if (input[i - 1] == '[') {
				arr.pop_back();
				result += temp;
				temp /= 3;
			}
			else if (arr.empty() != 1) {
				if (arr.back() == '[') {
				arr.pop_back();
				temp /= 3;
				}
			}
			else {
				cout << 0 << '\n';
				return 0;
			}
		}

		
		
	}

	if(arr.empty()!= 1)
		cout << 0 << '\n';
	else
		cout << result << endl;
	return 0;
}
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준] 2140-지뢰찾기(C++)  (0) 2020.05.20
[백준] 6416-트리인가?(C++)  (0) 2020.05.18
[백준] 2194-유닛 이동시키기(C++)  (0) 2020.05.08
[백준] 1756-피자 굽기(C++)  (0) 2020.05.08
[백준] 1188-음식 평론가(C++)  (0) 2020.05.03

+ Recent posts