[C++] 백준 2257 - 화학식량

메르센고수·2023년 8월 4일
0

Baekjoon

목록 보기
1/48
post-thumbnail

- 백준 2257 : 화학식량 (Silver2)

[백준 2257] https://www.acmicpc.net/problem/2257

접근 전략

C++의 stack STL을 이용하여 stack을 통해 입력값들의 화학식량을 계산

소스 코드

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

namespace VALUE{
    enum{
        H=1, C=12, O=16
    };
} // 화학식량 이름공간 선언
int main(void){
    string ChemVal;
    cin>>ChemVal;

    int answer=0;
    stack<int> S; // stack 생성

    for(char c: ChemVal){ // chemVal에서 c에 대응하는 원소를 찾기
        if(c=='('){
            S.push(-1); // '('를 -1로 선언
        }else if(c==')'){
            int num=0;
            while(S.top()!=-1){
                num+=S.top();
                S.pop();
            } // 스택의 제일 위 원소가 '('이 되기 전까지 num에 더해주고, stack에서 pop함
            S.pop();
            S.push(num);
        }else if(c>='2' && c<='9'){
            int val=c-'0'; // char를 int로 바꿔주기 위함
            int prev=S.top();
            S.pop();
            S.push(val*prev); // 원소기호와 그에 대응하는 개수를 곱해주기 위함
        }else{
            if(c=='H'){
                S.push(VALUE::H);
            }else if(c=='C'){
                S.push(VALUE::C);
            }else if(c=='O'){
                S.push(VALUE::O);
            }
        } // 원소기호에 대응하는 값을 stack에 push함
    }
    while(!S.empty()){
        answer+=S.top();
        S.pop();
    } // stack이 비어있지 않다면, 스택의 요소를 answer에 더해주고, pop함

    cout<<answer<<endl;
    return 0;
}

코드 풀이

요즘 C++을 배우고 있어서 배운 내용을 써먹어 보고자 수소, 탄소, 산소에 대응하는 원소의 화학식량을 저장하는 VALUE namespace를 이용해서 구현을 해보았다.
화학식량을 가져올 때마다 VALUE::C 와 같이 이름 공간도 함께 불러와야 하는 번거로움이 살짝 있지만, C언어에서 구조체를 선언하는 것과 비슷한 결이기 때문에 c=='C' 이런 식으로 선언하는 것 보다는 개인적으론 조금 더 깔끔한 것 같다.

결과

profile
블로그 이전했습니다 (https://phj6724.tistory.com/)

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기