본문 바로가기
백준브실골/기타

백준 3284, MASS

by oculis 2023. 5. 4.
728x90

개요

문제 링크
골드 5, Stack
탄화수소의 분자량 구하기


접근

  1. 화1 선택자라면 지긋지긋할 탄화수소이다. 내 기억에 C4H8이 8개였나 그랬는데 -CH3, -CH2, -CH1, C 개수를 다 외워버렸던 기억이 난다.
  2. 문제로 돌아와서, 일반적인 괄호 문제랑 매우 유사하다. 4928과 풀이가 거의 비슷하니 이해를 위해 같이 읽어보길 바란다.
  3. 만약 괄호가 열린다면 depth를 하나 추가한다. depth는 왜 설정하냐 하면 괄호가 닫힐 때 depth-1 번째에 값을 더해줘야 하기 때문이다.
    1. 말이 어려운데, 이런 식을 생각하자.
      ((1+2x3)x3+1) = ((D2)x3+1) = D1
      괄호 안에 덩어리를 괄호의 개수에 맞게 기호로 바꿔 D1, D2로 표현할 수 있다.
    2. 다음은 재귀적으로 접근하는 것이다. D2를 감싸는 괄호를 풀어주기 위해서는 D2에 들어있는 모든 값에 3을 곱해야 하고, 그러려면 D1과 D2의 값이 구분되어 저장되어 있어야 한다.
    3. 만약 괄호가 닫힌다면? 닫는 괄호 옆에 숫자가 있다면 그 숫자를 곱해서 부모 (depth-1)에 더해주고, 아니면 그냥 더해주면 된다.
  4. 나머지는 map을 이용해주면 크게 어렵지 않다.

Pseudo code

map = {C:12, H:1, O:16}

x=string[i]
if (x = '(') depth++;
else if (x = "C|H|O") stack[depth] += map[x]
else if (x = ')') {
    time = 1
    if (next = number) time = next
    stack[depth-1] += stack[depth] * time
    stack[depth] = 0 // 초기화
    depth-- // depth번째 괄호 모두 정리됨
}
else stack[depth] *= x // 숫자

Source code

#include <bits/stdc++.h>
using namespace std;

using str=string;

int a[110],d=0;
int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    map<char,int> m = {{'C',12},{'O',16},{'H',1}};
    str s; cin>>s;
    int n=s.size(),k;
    for (int i=0;i<n;i++) {
        char x=s[i];
        if (x=='(') d++;
        else if (x==')') {
            k=1;
            if (i<n-1&&'0'<=s[i+1]&&s[i+1]<='9') k=s[i+1]-'0';
            a[d-1]+=a[d]*k,a[d]=0,d--;
        }
        else if (x=='C'||x=='O'||x=='H') a[d]+=m[x];
        else a[d]+=(x-'1')*m[s[i-1]];
    }
    cout<<a[0];
}
728x90

'백준브실골 > 기타' 카테고리의 다른 글

백준 25331, Drop 7  (2) 2023.05.04
백준 4422, Crypt Kicker II  (0) 2023.05.04
백준 27715, 우표 구매하기 (Easy)  (0) 2023.05.04
백준 4843, Coin Toss  (0) 2023.05.04
백준 14921, 용액 합성하기  (0) 2023.05.03
백준 2381, 최대 거리  (0) 2023.04.05
백준 8983, 사냥꾼  (0) 2023.04.05
백준 1208, 부분수열의 합 2  (0) 2023.04.05

댓글