화학식이 있다고 가정합니다. 각 원자의 개수를 찾아야 합니다.
원자적 요소는 항상 대문자로 시작하며 이름을 나타내는 0개 이상의 소문자가 있을 수 있습니다. 카운트가 1보다 크면 해당 요소의 카운트를 나타내는 1개 이상의 숫자가 뒤따를 수 있습니다. 그러나 카운트가 1이면 숫자가 뒤따르지 않습니다. 예를 들어 H2O와 H2O2는 모두 유효하지만 H1O2는 유효하지 않습니다.
따라서 입력이 Na2(CO)3와 같으면 출력은 C3Na2O3가 되므로 3 Carbon(C), 2 Sodium(Na), 3 Oxygen(O)을 나타냅니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
makeRet() 함수를 정의하면 하나의 맵 m이 필요합니다.
-
ret :=빈 문자열
-
m −
의 각 키-값 쌍 'it'에 대해-
ret :=ret + 그것의 키
-
값> 1이면 -
-
ret :=ret + 문자열 값
-
-
-
리턴 렛
-
countOfAtoms() 함수를 정의하면 s가 필요합니다.
-
하나의 맵 정의
-
하나의 스택 정의
-
i :=0, n :=s의 크기
-
나는
-
c :=s[i]
-
(i를 1씩 증가)
-
c가 '('와 같으면 -
-
m을 st에 삽입
-
m :=하나의 맵 정의
-
-
그렇지 않으면 c가 ')'와 같을 때 -
-
값 :=0
-
동안 (i
-
val :=val * 10 + (s[i] - '0'의 ASCII)
-
(i를 1씩 증가)
-
-
하나의 맵 temp 정의 :=st의 최상위 요소
-
st
에서 요소 삭제 -
m −
의 각 키-값 쌍 'it'에 대해-
그것의 가치 :=그것의 가치 * val
-
temp[키] :=temp[키] + 값
-
-
m :=온도
-
-
그렇지 않으면
-
이름 :=빈 문자열
-
값 :=0
-
이름 :=이름 + c
-
동안 (i
-
이름 :=이름 + s[i]
-
(i를 1씩 증가)
-
-
동안 (i
-
val :=val * 10 + (s[i] - '0'의 ASCII)
-
(i를 1씩 증가)
-
-
val :=(val이 0과 같으면 1, 그렇지 않으면 val)
-
m[이름] :=m[이름] + 발
-
-
-
makeRet(m) 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string makeRet(map<string, int> m){
string ret = "";
for (auto& it : m) {
ret += it.first;
if (it.second > 1) {
ret += to_string(it.second);
}
}
return ret;
}
string countOfAtoms(string s){
map<string, int> m;
stack<map<string, int> > st;
int i = 0;
int n = s.size();
while (i < n) {
char c = s[i];
i++;
if (c == '(') {
st.push(m);
m = map<string, int>();
}
else if (c == ')') {
int val = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
val = val * 10 + (s[i] - '0');
i++;
}
map<string, int> temp = st.top();
st.pop();
for (auto& it : m) {
it.second *= val;
temp[it.first] += it.second;
}
m = temp;
}
else {
string name = "";
int val = 0;
name += c;
while (i < n && s[i] >= 'a' && s[i] <= 'z') {
name += s[i];
i++;
}
while (i < n && s[i] >= '0' && s[i] <= '9') {
val = val * 10 + (s[i] - '0');
i++;
}
val = val == 0 ? 1 : val;
m[name] += val;
}
}
return makeRet(m);
}
};
main(){
Solution ob;
cout << (ob.countOfAtoms("Na2(CO)3"));
} 입력
Na2(CO)3
출력
C3Na2O3