[C++] 백준 1907 [탄소 화합물]
String Split을 활용할만한 예제 문제이다.
문제설명
분자 + 분자 = 분자
분자의 가능한 표현 : 원자 뒤 숫자, only 원자
원자 : C, H, O
숫자 : 2~9
CHO + C2H3O = C3H4O2
와 같은 표현식 가능
x1(분자1) + x2(분자2) = x3(분자3) 라는 분자표현식이 존재할 때, 올바른 분자 표현식이 되도록 x1, x2, x3를 구하는 문제
단 x1, x2, x3는 10 이하
풀이방법
String을 +와 = 을 기준으로 분리하여 3개의 string을 vector에 담았다.
v[0] = 분자1
v[1] = 분자2
v[2] = 분자3
그리고 각 분자마다 map 자료구조를 두어 C,H,O의 개수를 저장한다
map[0] = {C 1, H 1, O 1}
…
그 이후 브루트포스로 모든 x1, x2, x3를 순회하면서 x1 * 분자1의 (C,H,O)개수 + x2 * 분자2의 (C,H,O) = x3 * 분자3의 (C,H,O)
를 만족하는 x1, x2, x3를 찾는다
소스코드
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<map>
using namespace std;
bool is_int(char s){
if(s-'2' >= 0 && s-'9' <= 0) return true;
return false;
}
int main(){
string s, temp_str;
vector<string> v;
cin >> s;
istringstream iss(s);
map<char, int> m[3];
// split '+'
while(getline(iss, temp_str, '+')){
v.push_back(temp_str);
}
istringstream iss2(v.back());
v.pop_back();
// split '='
while(getline(iss2, temp_str, '=')){
v.push_back(temp_str);
}
for(int i=0; i<v.size(); i++){
string s = v[i];
for(int j=0; j<s.length(); j++){
if(j+1 == s.length()){
m[i][s[j]] += 1;
break;
}
else if (is_int(s[j+1])){
m[i][s[j]] += int(s[j+1] - '0');
j++;
}
else{
m[i][s[j]] += 1;
}
}
}
for(int i=1; i<=10; i++){
for(int j=1; j<=10; j++){
for(int k=1; k<=10; k++){
bool a = m[0]['C']*i + m[1]['C']*j == m[2]['C']*k;
bool b = m[0]['H']*i + m[1]['H']*j == m[2]['H']*k;
bool c = m[0]['O']*i + m[1]['O']*j == m[2]['O']*k;
if(a && b && c){
cout << i << " " << j << " " << k;
return 0;
}
}
}
}
}
Leave a comment