코드업 문제풀이

코드업 2013 화학식량 구하기 서식 지정자 %g 활용 풀이

하루에 한번 방문하기 2021. 3. 2. 20:52

코드업 2013

문제 설명

분자량 구하기 2를 해결한 광곽이는 C H 이외의 다른 기본적인 원소들이 포함된 화학식의 화학식량도 구할 수 있으면 좋겠다는 생각을 했다.

그래서 분자량 구하기 2에서 만든 프로그램에 기능을 더 추가하여 다른 원소들이 입력되어도 화학식량을 구할 수 있게 하려고 한다.

광곽이를 도와주자.

입력

화학식이 입력된다. (입력 형식은 분자량 구하기 2 문제와 같다. 입력되는 문자열의 길이는 14 이하이며, 각 원소의 계수는 100 이하의 자연수이다.)

입력되는 원소의 종류와 원자량(근사값)은 아래와 같다.

출력

입력된 화학식의 화학식량을 출력한다. 0으로 계속되는 소수점 아래 부분은 출력하지 않는다.

코드업 2013 화학식량 구하기 입출력 예시


풀이

#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