코드업 2013
문제 설명
분자량 구하기 2를 해결한 광곽이는 C와 H 이외의 다른 기본적인 원소들이 포함된 화학식의 화학식량도 구할 수 있으면 좋겠다는 생각을 했다.
그래서 분자량 구하기 2에서 만든 프로그램에 기능을 더 추가하여 다른 원소들이 입력되어도 화학식량을 구할 수 있게 하려고 한다.
광곽이를 도와주자.
입력
화학식이 입력된다. (입력 형식은 분자량 구하기 2 문제와 같다. 입력되는 문자열의 길이는 14 이하이며, 각 원소의 계수는 100 이하의 자연수이다.)
입력되는 원소의 종류와 원자량(근사값)은 아래와 같다.
출력
입력된 화학식의 화학식량을 출력한다. 0으로 계속되는 소수점 아래 부분은 출력하지 않는다.
풀이
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<pair<string, float>> atomDataSet =
{
{"He",4},//첫 글자가 같은 원소라면 긴 원소부터 검색
{"H", 1},
{"B",10.8} ,
{"Cl",35.5} ,
{"C",12} ,
{"Ne",20.2} ,
{"Na",23} ,
{"N",14} ,
{"O",16} ,
{"F",19} ,
{"P",31} ,
{"S",32} ,
{"K",39.1}
};
//문자열의 끝에는 개행 문자 '\0'이 오기에 14 + 1의 공간 할당
char str[15];
float result = 0;
scanf("%s", str);
for (int i = 0; str[i] != '\0'; i) {
//원소기호 문자열 검색
for (int j = 0; j < atomDataSet.size(); j++) {
int c = 0;
bool isContains = true;
for (c; c < atomDataSet[j].first.length(); c++) {
//문자열 일치 유무 확인
if (str[i + c] != atomDataSet[j].first[c]) {
isContains = false;
break;
}
}
//화학식량에 더하기 진행
if (isContains)
{
i += c;
//문자열에서 계수 추출
float value = 0;
int t = (int)str[i] - 48;
//문자를 발견했을 경우
if (!(t >= 0 && t <= 9))
//화학식에서 계수값 생략은 계수 1로 간주
value = 1;
else
while (str[i] != '\0') {
t = (int)str[i++] - 48;
if (t >= 0 && t <= 9)
value = value * 10 + t;
//문자를 발견했을 경우
else {
i--;
break;
}
};
result += atomDataSet[j].second * value;
//원소기호 검색 종료
j = atomDataSet.size();
}
}
}
//형식지정자 %g로 소수점 이하 0을 제거해 출력
printf("%g", result);
return 0;
}
코드를 깔끔히 짠 모범 소스를 보고 싶은데 이 문제는 안나오네요.
구글링해보니 다른 분은 strlen 함수로 문자열 길이를 얻고,
조건문에 각 원소에 대응하는 원자량 작성으로 푸시더군요.
다음부터 문자열 길이 얻을 때 strlen 함수 써야겠어요.
'코드업 문제풀이' 카테고리의 다른 글
코드업 1097번 바둑알 십자 뒤집기 문제 (0) | 2019.08.30 |
---|