본문 바로가기
프로그램

[파이썬] 문제 : 분자식을 분해해서 원소질량 합계 구하기

by 오디세이99 2023. 12. 17.
728x90
반응형
dic = {'H':1, 'O':16, 'Na':23, 'Cl':35.5, 'C':12.0}  # 원소기호와 원소질량

'''
물 : H2O
영화나트륨:NaCl
에탄올 : C2H6O
이사화탄소 : CO2
'''
molecule = 'NaCl'    # CO2 , 

# 원소 분리
idx = 0
element_dic = {}     # 분리된 원소 저장. 예: {'H':2, 'O':1}
while True:         # 무한 반복
    tmp = molecule[idx]                   # 분자식 중에서 1개 문자 가져옴
    # print(tmp, idx)
    if idx < len(molecule)-1:            # 분자식의 마지막 문자가 아니면
        if molecule[idx+1].isnumeric():  # 현재 문자의 뒷 문자가 숫자형태면
            element_dic[tmp] = int(molecule[idx+1])   # 현재 문자가 분자기호이고 뒤의 정수는 수로 인식. 딕셔너리에 저장
            idx += 1                     # 문자의 인덱스를 증가. 뒤 문자(수)까지 처리 했으므로
            # print('#step=2 /',tmp, idx)
        elif molecule[idx+1].islower():  # 현재 문자의 뒷 문자가 소문자형태면
            tmp += molecule[idx+1]        # 현재와 문자와 뒷문자(소문자)까지 분자기호로 인식
            element_dic[tmp] = 1          # 분자기호를 딕셔너리의 키로 하고 값은 1 로 저장
            idx += 1                      # 문자의 인덱스 증가. 뒤 문자(소문자)까지 처리 했으므로
            # print('#step=3 /',tmp, idx) 
        else:                             # 현재 문자의 뒷 문자가 숫자형태도 아니고 소문자도 아니면
            element_dic[tmp] = 1           # 현재 문자만 딕셔너리에 등록. 값은 1 로 함
            # print('#step=4 /',tmp, idx)
    else:                                  # 분자식의 마지막 문자면
        element_dic[tmp] = 1               # 현재 문자만 딕셔너리에 등록. 값은 1 로 함
        # print('#step=4 /',tmp, idx)            

    idx += 1                               # 인덱스 증가
    if idx >= len(molecule):               # 인덱스가 분자식 길이 보다 크가나 같으면 반복문 중지
        break
        
element_sum = 0                            # 값 계산
for key, value in element_dic.items():     # 저장한 딕셔너리에서 key와 value를 불러 옴
    element_sum += dic[key] * value        # 계산
    print(f"{key}:{value}")
print('질량 합계:',element_sum)                         # 질량 합계

728x90
반응형

댓글