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
반응형
'프로그램' 카테고리의 다른 글
[파이썬] 문제 : 1~100까지 합 중 3000 넘는 숫자와 4000 넘는 합 출력 (0) | 2023.12.20 |
---|---|
[파이썬] 문제 : 과목 평균 구하기 (보라돌이,뚜비,나나) (0) | 2023.12.18 |
[파이썬] 문제 : 프로세스, 쓰레드 리스트 (0) | 2023.12.16 |
[파이썬] 문제 : mp3 정보 찾기 (0) | 2023.12.14 |
[파이썬] 문제 : text의 학색 점수 읽어서 합계 및 평균 계산 (0) | 2023.12.14 |
댓글