본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2013] : 화학식량 구하기

by 조원일 2020. 2. 17.
728x90

1. 문제

https://codeup.kr/problem.php?id=2013

 

화학식량 구하기

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

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번 문제는 문자열로 주어진 화학식을 slice를 통해 각 분자로 구분한뒤 총 분자량을 구하는 문제입니다.

 

 

2. 해답

#include <stdio.h>
#include <stdbool.h>

float check(char arr[5]) {
	float tmp, sum = 0.0;
	int n = 0, p;
	// 문자열에서 원자를 구분
	if (arr[0] == 'H') {
		if (arr[1] == 'e') { tmp = 4; p = 2; }
		else { tmp = 1; p = 1; }
	}
	else if (arr[0] == 'B') {
		tmp = 10.8;
		p = 1;
	}
	else if (arr[0] == 'C') {
		if (arr[1] == 'l') { tmp = 35.5; p = 2; }
		else { tmp = 12; p = 1; }
	}
	else if (arr[0] == 'N') {
		if (arr[1] == 'e') { tmp = 20.2;p = 2; }
		else if (arr[1] == 'a') { tmp = 23;p = 2; }
		else { tmp = 14;p = 1; }
	}
	else if (arr[0] == 'O') {
		tmp = 16;
		p = 1;
	}
	else if (arr[0] == 'F') {
		tmp = 19;
		p = 1;
	}
	else if (arr[0] == 'P') {
		tmp = 31;
		p = 1;
	}
	else if (arr[0] == 'S') {
		tmp = 32;
		p = 1;
	}
	else if (arr[0] == 'K') {
		tmp = 39.1;
		p = 1;
	}
	if (p == strlen(arr)) return tmp; // 원자 개수가 1개이면 원자량을 리턴

	for (int i = p;i < strlen(arr);i++) {
		n = (n * 10) + ((int)arr[i] - 48); // 원자 개수 구하기
	}

	return tmp * n;
}

int main() {
	char Arr[15], tmp[5];
	bool se = false;
	int p = 0;
	float sum = 0.0;

	scanf("%s", Arr);

	for (int i = 0;i < strlen(Arr);i++) {
		if ((int)Arr[i] >= 65 && (int)Arr[i] <= 90 && i > 0) {
			// 숫자가 아니면 지금까지 저장했던 문자열을 check함수에 입력
			tmp[p] = NULL;
			sum += check(tmp);
			p = 0;
			tmp[0] = NULL;
			
		}
		tmp[p++] = Arr[i];
	}
	tmp[p] = NULL;
	sum += check(tmp);

	if ((int)sum == sum) printf("%d", (int)sum);
	else printf("%.1f", sum);

	return 0;
}

 

'프로그래밍 > CodeUp' 카테고리의 다른 글

CodeUp[Q_2017] : 진법 변환  (0) 2020.02.19
CodeUp[Q_2016] : 천단위 구분기호  (0) 2020.02.18
CodeUp[Q_2012] : 1의 개수는? 2  (0) 2020.02.10
CodeUp[Q_2011] : 369 게임 2  (0) 2020.02.10
CodeUp[Q_2010] : 루트 문제(?)  (0) 2020.02.09