[C++] 백준 1907 [탄소 화합물]

date:

Updated:


Categories:

Tags: , , ,

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