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