화학식량
화학식이 주어지면, 식에 포함된 모든 원자들의 질량합을 구해야 한다.(이를 화학식량이라 한단다)
원자의 종류는 세 가지만 주어지며, 괄호에 곱해지는 숫자는 정수로 최대 9이다.
보통 괄호가 중첩되면서 안의 데이터를 가공해야 할 때 스택을 주로 쓰곤 한다.
따라서 재귀적으로 식을 가공하는 것과 동일하지만, 빡대가리는 재귀함수를 구성하는 것도 버겁기 때문에
한 글자 한 글자 보면서 스택을 채워보자.
글자들은 4가지로 분류할 수 있다.
1. 알파벳 2. 숫자 3. 여는 괄호 4. 닫는 괄호
여는 괄호(3)가 의미하는 바는, 이제 닫는 괄호(4)가 나올 때 까지 안의 작은 식을 계산해야 함을 의미한다.
자연스럽게 새로운 스택을 쌓으라는 뜻과 일치한다.
안의 식을 계산했다 치고 괄호의 끝이 나오면 어떻게 해야 할까? 더 이상의 작은 식은 없다는 뜻이니까
계산한 결과를 아래 스택에 더해주자. (POP하고 TOP에 더해준다)
문제는 숫자다. 닫는 괄호나 알파벳의 뒤엔 숫자가 올 수도 있고, 그렇다면 앞의 작은 식에 숫자를 곱해줘야 한다.
따라서 알파벳(1)이나 닫는 괄호(4)가 나올 때면, 뒤에 숫자가 올 수도 있으므로 임시변수에 결과를 기록해야 한다.
다행히 새로운 알파벳, 닫는 괄호가 연달아 나온다 해도 숫자는 작은 식 전체에 곱해지는 것이므로
인트형 변수 하나로 결과를 기록할 수 있다.
이제 케이스 별로 스택의 동작을 정의해보자.
1 -> 현재 TOP에 원자량을 더한다. 임시변수에 원자량을 저장한다.
3 -> 새로운 스택을 쌓고 0으로 초기화 한다.
4 -> 현재 TOP의 값을 임시변수에 저장하고 POP한다. 이 후 TOP에 결과를 더해준다.
2 -> 임시변수에 숫자를 곱해 TOP에 더해준다. 다만 1과 4에서 이미 TOP에 한 번 더해줬으므로 1만큼 덜 곱해야 한다
소스로 옮기면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <stdio.h> #include <string.h> int stack[100], st_cnt, tmp; char buf[101]; int main() { scanf("%s", buf); int l = strlen(buf); for (int i = 0; i < l; ++i) { char c = buf[i]; if (c == 'H') { tmp = 1; stack[st_cnt] += 1; } else if (c == 'C') { tmp = 12; stack[st_cnt] += 12; } else if (c == 'O') { tmp = 16; stack[st_cnt] += 16; } else if (c == '(') stack[++st_cnt] = 0; else if (c == ')') { tmp = stack[st_cnt--]; stack[st_cnt] += tmp; } else if ('1' < c && c <= '9') stack[st_cnt] += tmp * (c - '1'); } printf("%d", stack[0]); return 0; } | cs |
'알고리즘 > 미분류' 카테고리의 다른 글
백준) 11003 최소값 찾기 (0) | 2018.07.13 |
---|---|
중위표기법을 후위표기법으로 바꿔서 계산하는 알고리즘 (0) | 2018.02.22 |
백준) 2841 외계인의 기타 연주 (0) | 2018.01.22 |
백준) 3986 좋은 단어 (0) | 2018.01.22 |
백준) 9935 문자열 폭발 (스택) (0) | 2018.01.22 |