<동녘짱과 아이들> 팀이 내주신 문제 풀이 완료 [2023-04-20 학습일지]
"""
FILE_NAME : team_problem_transfusion_ask.py
출제팀 : 동녘짱과 아이들
출제일자 : 2023-04-18
문제 이름 : [헌혈 문진표 제작]
조건 :
아래의 링크 및 조건을 확인한 후 당신이 "헌혈 가능 여부를 판단"하는 문진표를 만들어보세요.
완성도는 자유(조건문, 자료형, 연산자 등 사용)
참고 사이트
https://www.bloodinfo.net/emi2/login.do?_ga=2.184604009.1775326130.1670198672-409715244.1669188102
===============================================
[헌혈 조건 예시]
(조건 1) 이름, 나이, 체중, 혈압, 체온, 맥박, 최근헌혈날짜
(조건 2) 전혈은 8주를 경과해야 헌혈할 수 있음
(조건 3) 최근 1년간 전혈횟수 5회 이하일 경우 전혈 가능
(조건 4) 성분헌혈은 14일 경과해야 헌혈할 수 있음
(조건 5) 최근 1년간 성분헌혈횟수 24회 이하일 경우 성분헌혈 가능
(조건 6) 최근 질병에 감염된 여부
(조건 7) 최근 약물 복용 여부
(조건 8) 인플루엔자, A형간염, 일본뇌염(사백신) 등 예방접종 받은 후 24시간 경과 여부
(조건 9) B형 간염 예방접종 받은 날부터 2주 경과 여부
(조건 10) 홍역, 유행성이하선염, 풍진(MMR)의 혼합백신, 수두 등 예방접종 받은날로부터 4주 경과 여부
(조건 11) 수혈 후 1년 경과 여부
(조건 12) 과거 헌혈검사(B형간염, C형간염, 매독검사 등) 결과 정상 여부
(조건 13) 외국을 여행한 경우는 귀국 후 1개월 경과 여부
조건이 3개 이상 불충족 시 헌혈 불가
조건 모두 불충족 시 헌혈 불가
ㄴ 이런식으로 만들어도 됨(자유)
"""
blood_giver = {
'name': ''
}
print('[대한적십자사 혈액원 광주인력개발지사] 입니다. 어서오세요.')
message = """이름을 입력하세요
[이름 입력] : """
blood_giver['name'] = input(message)
user_answer = 0
gender = ''
is_possible_blood_giving = True
# TODO : 개인정보 확인하기
# TODO: (조건 1) 개인정보 검증
if is_possible_blood_giving:
message = """만 나이 17세 이상입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 2:
message = """만 나이 16세 이상입니까?"""
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1:
print('전혈만 가능하십니다.')
else:
print('연령이 어려 헌혈 진행 불가')
is_possible_blood_giving = False
else: # 17세 이상
pass
if is_possible_blood_giving:
message = """성별이 무엇입니까?"""
print(message)
user_answer = int(input('[1. 남자] [2. 여자]\n [번호 입력] : '))
if user_answer == 1: # 남자
gender = 'M'
message = """50Kg를 넘습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1:
pass
else:
print('체중이 낮아 헌혈 진행 불가')
is_possible_blood_giving = False
else: # 여자
gender = 'F'
message = """45Kg를 넘습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1:
pass
else:
print('체중이 낮아 헌혈 진행 불가')
is_possible_blood_giving = False
if is_possible_blood_giving:
message = """수축기압이 90~ 179mmHg이고 이완기가 100mmHg미만입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 혈압
pass
else:
print('혈압 비정상, 헌혈 진행 불가')
is_possible_blood_giving = False
if is_possible_blood_giving:
message = """체온이 37.5도 미만입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 체온
pass
else:
print('체온 비정상, 헌혈 진행 불가')
is_possible_blood_giving = False
if is_possible_blood_giving:
message = """맥박이 50~100(회/분)입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 맥박
pass
else:
print('맥박 비정상, 헌혈 진행 불가')
is_possible_blood_giving = False
if is_possible_blood_giving:
message = """신분증을 지참하셨니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 신분증 지참했음
pass
else:
print('신분증이 없으면 진행 불가능합니다.')
is_possible_blood_giving = False
# TODO: (조건 2) 전혈은 8주를 경과해야 헌혈할 수 있음
if is_possible_blood_giving:
message = """마지막 헌혈일로부터 8주가 지났습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 헌혈 주기
pass
else:
# TODO: (조건 4) 성분헌혈은 14일 경과해야 헌혈할 수 있음
message = """성분 헌혈 한지 14일이 지났습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 헌혈 주기
print('혈장성분헌혈, 혈소판성분헌혈, 혈소판혈장성분헌혈만 진행 가능합니다.')
else:
print('헌혈 주기가 너무 짧습니다. 헌혈 진행 불가')
is_possible_blood_giving = False
# TODO: (조건 3) 최근 1년간 전혈횟수 5회 이하일 경우 전혈 가능
if is_possible_blood_giving:
message = """과거 1년 이내에 전혈헌혈횟수 5회 이하입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 헌혈 주기
pass
else:
message = """성분 헌혈 한지 14일이 지났습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 헌혈 주기
print('혈장성분헌혈, 혈소판성분헌혈, 혈소판혈장성분헌혈만 진행 가능합니다.')
else:
print('헌혈 주기가 너무 짧습니다. 헌혈 진행 불가')
is_possible_blood_giving = False
# TODO: (조건 5) 최근 1년간 성분헌혈횟수 24회 이하일 경우 성분헌혈 가능
if is_possible_blood_giving:
message = """최근 1년간 성분헌혈횟수 24회 이하입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 정상 헌혈 주기
pass
else:
print('성분헌혈횟수가 너무 많습니다. 헌혈 진행 불가')
is_possible_blood_giving = False
# TODO: (조건 6) 최근 질병에 감염된 여부
if is_possible_blood_giving:
message = """최근 질병에 감염된적 있습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 최근 질병 감염된 상태
print('조금 더 안정되고 합시다. 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 7) 최근 약물 복용 여부
if is_possible_blood_giving:
message = """ 약물 관련 참고 !
건선 치료제 복용 후 3년 경과(일부는 영구 헌혈금지)
전립선비대증 치료제 복용 후 4주 또는 6개월 경과
탈모증 치료제 복용 후 4주 경과
여드름 치료제 복용 후 4주 경과
기타 헌혈금지약물 복용 후 일정기간 경과
헌혈금지약물 복용한 적이 있거나, 위의 해당 약물을 복용하고 충분한 시간이 안지났습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 약물 복용 상태
print('약물 복용 관련 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 8) 인플루엔자, A형간염, 일본뇌염(사백신) 등 예방접종 받은 후 24시간 경과 여부
# TODO: (조건 9) B형 간염 예방접종 받은 날부터 2주 경과 여부
# TODO: (조건 10) 홍역, 유행성이하선염, 풍진(MMR)의 혼합백신, 수두 등 예방접종 받은날로부터 4주 경과 여부
if is_possible_blood_giving:
message = """ 예방접종 관련 참고 !
인플루엔자, A형간염, 일본뇌염(사백신) 등 예방접종 받은 후 24시간 경과
B형 간염 예방접종 받은 날부터 2주 경과
홍역, 유행성이하선염, 풍진(MMR)의 혼합백신, 수두 등 예방접종 받은날로부터 4주 경과
충분한 시간이 안지났습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 약물 복용 상태
print('예방접종 관련 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 11) 수혈 후 1년 경과 여부
if is_possible_blood_giving:
message = """최근 1년동안 수혈 받은 적이 있습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 최근 수혈 상태
print('최근 수혈 관련 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 12) 여자만 해당) 임신 중인자, 분만 또는 유산 후 6개월 이내인 자는 헌혈에 참여하실 수 없습니다.
if is_possible_blood_giving and gender == 'F':
message = """임신 중이거나 분만 또는 유산 후 6개월 이내입니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 최근 수혈 상태
print('최근 preg 관련 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 13) 과거 헌혈검사(B형간염, C형간염, 매독검사 등) 결과 정상 여부
if is_possible_blood_giving:
message = """과거 헌혈검사에서 B형간염, C형간염, 매독검사 등 비정상 통보를 받은 적이 있습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 혈액 매개 감염 상태
print('과거 헌혈검사 관련 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
# TODO: (조건 14) 외국을 여행한 경우는 귀국 후 1개월 경과 여부
if is_possible_blood_giving:
message = """최근 1개월 내에 해외 체류한 적이 있습니까?"""
print(message)
user_answer = int(input('[1. 예] [2. 아니요]\n [번호 입력] : '))
if user_answer == 1: # 검역 필요 상태
print('해외체류 사유로 헌혈 진행 불가')
is_possible_blood_giving = False
else:
pass
if is_possible_blood_giving:
message = """축하합니다. 헌혈 진행 가능합니다."""
print(message)
else:
message = """죄송합니다."""
print(message)


헌혈 문제는 다수의 if 분기에서 원하는 상태에 이르러야 헌혈이 진행가능하다는 문구가 출력되게 했고, 만일 매 물음에서 확인하는 is_possible_blood_giving 의 boolean 타입이 False가 되는 경우엔 이하의 질문이 출력되지 않고, 사유와 사과의 문구를 출력하도록 설계했다.
각각의 선택지마다 어디에서 이후로 진행을 못하게 됐는지 데이터를 저장해두면 추후 통계에 참고할 수 있겠지만, 우선은 굳이 그럴 필요가 없어 기능구현에 초점을 두었다.
다만, 성별에 대해 요구하는 최저체중이 다르고, 임신과 관련된 선택지가 여자만 응답 가능하다는 점에서 유저가 입력한 값에 대해 성별 정보만 저장하여 다른 질문을 하도록 만들었다.
텍스트가 많아 힘들었지만, 로직이나 구현이 복잡한게 아니라서, 이와같이 만들었다. 조건을 활용해 분기하여 쓸만한 프로그램을 만드는 좋은 문제였다. 다만, 100% 구현에는 볼륨이 많아 조건을 줄였으면 더 좋았을 것 같다.
감사합니다.