※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1907번 문제인 탄소 화합물이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1907
1907번: 탄소 화합물
첫째 줄에 세 정수 X1, X2, X3 (1 이상 10 이하)를 빈 칸을 사이에 두고 순서대로 출력한다. 이는 각각 M1, M2, M3의 계수가 된다. 만일 해가 둘 이상이라면 답을 세 자연수로 이루어진 수열으로 생각해
www.acmicpc.net
주어진 형식의 문자열이 주어질 때, 첫번째, 두번째, 세번째 화학식을 구성하는 C, H, O의 개수를 구해두고 모든 가능한 계수의 쌍(1000가지이다.)에 대해 사전순으로 해당 계수가 주어진 식을 만족시키는지를 확인해 문제를 해결할 수 있다.
세 화학식은 '+'와 '='를 기준점으로 생각하면 간단하게 구분해낼 수 있다.
또한 이 문제에서 화학식에 주어지는 수는 항상 한자리이고 그 앞에는 그 대상인 원소가 등장하므로, 수가 등장할 때마다 바로 앞의 원소의 개수를 그 수에 맞게 추가하는 것으로 각 화학식을 구성하는 원소의 수를 계산할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int slen;
string s;
int pidx, eidx;
int c1, h1, o1, c2, h2, o2, c3, h3, o3;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> s;
slen = s.length();
for (int i = 0; i < slen; i++) {
if (s[i] == '+') pidx = i;
else if (s[i] == '=') eidx = i;
}
int ccnt = 0, hcnt = 0, ocnt = 0; char old = 'Z';
for (int i = 0; i < pidx; i++) {
if ('0' <= s[i] && s[i] <= '9') {
if (old == 'C') ccnt += s[i] - '1';
else if (old == 'H') hcnt += s[i] - '1';
else ocnt += s[i] - '1';
}
else {
if (s[i] == 'C') ccnt++, old = s[i];
else if (s[i] == 'H') hcnt++, old = s[i];
else ocnt++, old = s[i];
}
}
c1 = ccnt, h1 = hcnt, o1 = ocnt;
ccnt = 0, hcnt = 0, ocnt = 0; old = 'Z';
for (int i = pidx + 1; i < eidx; i++) {
if ('0' <= s[i] && s[i] <= '9') {
if (old == 'C') ccnt += s[i] - '1';
else if (old == 'H') hcnt += s[i] - '1';
else ocnt += s[i] - '1';
}
else {
if (s[i] == 'C') ccnt++, old = s[i];
else if (s[i] == 'H') hcnt++, old = s[i];
else ocnt++, old = s[i];
}
}
c2 = ccnt, h2 = hcnt, o2 = ocnt;
ccnt = 0, hcnt = 0, ocnt = 0; old = 'Z';
for (int i = eidx + 1; i < slen; i++) {
if ('0' <= s[i] && s[i] <= '9') {
if (old == 'C') ccnt += s[i] - '1';
else if (old == 'H') hcnt += s[i] - '1';
else ocnt += s[i] - '1';
}
else {
if (s[i] == 'C') ccnt++, old = s[i];
else if (s[i] == 'H') hcnt++, old = s[i];
else ocnt++, old = s[i];
}
}
c3 = ccnt, h3 = hcnt, o3 = ocnt;
for (int i = 1; i < 11; i++) {
for (int j = 1; j < 11; j++) {
for (int k = 1; k < 11; k++) {
if (i * c1 + j * c2 == k * c3 && i * h1 + j * h2 == k * h3 && i * o1 + j * o2 == k * o3) {
cout << i << ' ' << j << ' ' << k;
return 0;
}
}
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3181 // C++] 줄임말 만들기 (0) | 2023.02.16 |
---|---|
[BOJ 3184 // C++] 양 (0) | 2023.02.16 |
[BOJ 24444 // C++] 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.02.15 |
[BOJ 24446 // C++] 알고리즘 수업 - 너비 우선 탐색 3 (0) | 2023.02.15 |
[BOJ 24445 // C++] 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.02.15 |