화학식이 있다고 가정합니다. 각 원자의 개수를 찾아야 합니다.
원자적 요소는 항상 대문자로 시작하며 이름을 나타내는 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