분자식

시간 제한3초메모리 제한128 MB

요약
괄호와 반복 횟수가 있는 분자식을 파싱해 원자량 표로 분자 무게를 계산하고, 알 수 없는 원소가 있으면 UNKNOWN을 출력합니다.
난이도

보통10점 중 4점

유형
재귀, 문자열, 구현
정답자
아직 제출이 없습니다

문제

가상 화학에서 분자식으로 표현된 분자의 무게를 계산하는 프로그램을 작성하시오. 실제 화학처럼 각 분자식은 하나 이상의 원자로 이루어진 분자를 나타내지만, 화학적으로 실제 존재할 필요는 없다.

  • 하나의 원자는 원자 기호로 나타낸다. 원자 기호는 대문자 하나이거나, 대문자 뒤에 소문자 하나가 붙은 것이다. 예를 들어 H와 He는 원자 기호이다.
  • 분자식은 원자 기호를 비어 있지 않게 나열한 것이다. 예를 들어 HHHeHHHe는 H 원자 네 개와 He 원자 두 개로 이루어진 분자를 나타낸다.
  • 같은 부분식 XX가 연속으로 nn번 반복될 때(nn은 22 이상 9999 이하의 정수), 이를 (X)n으로 줄여 쓸 수 있다. XX가 원자 기호 하나이면 괄호를 생략할 수 있다. 예를 들어 HHHeHHHe는 H2HeH2He, (HHHe)2, (H2He)2, ((H)2He)2로도 쓸 수 있다.

모든 분자식의 집합은 하나의 형식 언어로 볼 수 있다. 위의 설명을 요약하면, 분자식의 문법은 다음과 같이 정의된다.

     Molecule → Atom | Atom Number | ( Molecule ) Number | Molecule Molecule
         Atom → CapitalLetter | CapitalLetter SmallLetter
       Number → 2 | 3 | 4 | · · · | 97 | 98 | 99
CapitalLetter → A | B | C | · · · | X | Y | Z
  SmallLetter → a | b | c | · · · | x | y | z

각 원자는 고유한 원자량을 가진다. 분자량은 구성 원자들의 원자량을 모두 더한 값이다. 예를 들어 H와 He의 원자량이 각각 11, 44이면, (H2He)2로 표현되는 분자의 무게는 1212이다.

입력

입력은 두 부분으로 이루어진다.

첫 번째 부분은 원자표이다. 여러 줄로 이루어지며, 각 줄에는 원자 기호, 하나 이상의 공백, 그리고 그 원자량(양의 정수, 10001000 이하)이 있다. 같은 원자 기호가 두 줄에 나오지는 않는다. 이 부분은 END_OF_FIRST_PART만 있는 줄로 끝난다.

두 번째 부분은 여러 줄로 이루어진다. 각 줄은 공백이 없는 길이 8080 이하의 분자식이다. 한 분자는 최대 105105개의 원자를 포함한다. 분자식에 나오는 원자 기호 중 일부는 원자표에 없을 수도 있다. 이 부분은 0 하나만 있는 줄로 끝난다.

출력

두 번째 부분의 각 분자식에 대해 한 줄씩 출력한다. 분자식의 모든 원자 기호가 원자표에 있으면 그 분자량을 정수로 출력하고, 그렇지 않으면 UNKNOWN을 출력한다. 다른 문자는 출력하지 않는다.

예제7

  1. 예제 1

    입력
    H 1
    He 4
    C 12
    O 16
    F 19
    Ne 20
    Cu 64
    Cc 333
    END_OF_FIRST_PART
    H2C
    (MgF)2As
    Cu(OH)2
    H((CO)2F)99
    0
    
    예상 출력
    14
    UNKNOWN
    98
    7426
    
  2. 예제 2

    입력
    H 1
    He 4
    O 16
    END_OF_FIRST_PART
    H
    ((H)2He)2
    H2O
    Xx
    0
    
    예상 출력
    1
    12
    18
    UNKNOWN
    
  3. 예제 3

    입력
    Na 23
    Cl 35
    END_OF_FIRST_PART
    Na99
    (NaCl)2
    NaCl
    0
    
    예상 출력
    2277
    116
    58
    
  4. 예제 4

    입력
    C 12
    Co 59
    O 16
    END_OF_FIRST_PART
    CoO
    CO
    Co2
    0
    
    예상 출력
    75
    28
    118
    
  5. 예제 5

    입력
    H 1
    END_OF_FIRST_PART
    H2Mg
    H
    0
    
    예상 출력
    UNKNOWN
    1
    
  6. 예제 6

    입력
    H 1
    O 16
    C 12
    END_OF_FIRST_PART
    ((CO2)3H)2
    0
    
    예상 출력
    266
    
  7. 예제 7

    입력
    Zz 1000
    Q 1
    END_OF_FIRST_PART
    Zz99
    Q99
    (QQ)33
    0
    
    예상 출력
    99000
    99
    66