축의금 계산 프로그램 (Python)

팀플을 하다가 친구가 축의금 계산하는 표를 알려줬다. 프로그램으로 만들면 재밌을 것 같아서 만들었다.

직접 해봤는데 꽤 그럴 듯한 금액들이 나온다 ㅋㅋ






코드 설명

Question 클래스 만들기

ask() 메서드로 질문을 하고 유저로부터 answer를 받는다. answer가 Yes면 self.Y_next에 저장된 다음 Question 객체로, No면 self.N_next에 저장된 다음 Question 객체로 이동한다.


class Question :
    extra = 0 
    def __init__(self, Y_cost, N_cost, question) :
        self.Y_cost = Y_cost
        self.N_cost = N_cost
        self.question = question
    
    def link_next(self,Y_next, N_next) : 
        self.Y_next = Y_next
        self.N_next = N_next
        
    def ask(self):
        while True : 
            self.answer = input(f"{self.question} (Y/N)").upper()
            
            if self.answer == "Y" :
                Question.extra += self.Y_cost
                return self.Y_next
            elif self.answer == "N" :
                Question.extra += self.N_cost
                return self.N_next
            else : 
                print("'Y' 또는 'N'으로 입력해주세요")



Question 객체 생성 및 초기화

Yes일 때 추가할 축의금, No일 때 뺄 축의금, 질문 순서로 인자를 전달한다.


Q1 = Question(1, 0, "최근 1년 간 청첩장이 아닌 이유로 만난 적이 있다.")  
Q2 = Question(1, 0, "청첩장을 직접 받았다.")  
Q3 = Question(-1, 0, "청첩장을 모바일로 받았다.")
Q4 = Question(0, 0, "인연을 맺은 지 5년 이상이다.")  
Q5 = Question(0, 0, "직장 동료다.") 
Q6 = Question(0, 0, "SNS 친구다.")  
Q7 = Question(1, 0, "자주 보는 사이다.")  
Q8 = Question(-2, 0, "이번이 재혼이다.")  
Q9 = Question(2, 0, "식장이 호텔이다.")  
Q10 = Question(-2, 0, "그로부터 상처를 받은 적이 있다.")  
Q11 = Question(-1, 0, "결혼 성수기다. ") 
Q12 = Question(-1, 0, "식장이 지방이다.") #  -> 봉투만 전해도 OK
Q13 = Question(2, 0, "나도 2년 안에 결혼할 예정이다.") # -> 필참
Q14 = Question(1, 0, "액수를 정했는데 뭔가 불안하다.") # -> 봉투만 전해도 OK



Question 객체 잇기

Yes일 때 다음으로 넘어갈 Question 객체, No일 때 다음으로 넘어갈 Question 객체를 link_next() 메서드의 인자로 전달한다. 마지막 12~14번 질문은 결과를 저장.


Q1.link_next(Q2, Q3)
Q2.link_next(Q5, Q3)
Q3.link_next(Q6, Q5)
Q4.link_next(Q7, Q9)
Q5.link_next(Q7, Q4)
Q6.link_next(Q11, Q5)
Q7.link_next(Q8, Q9)
Q8.link_next(Q10, Q11)
Q9.link_next(Q13, Q12)
Q10.link_next(Q12, Q11)
Q11.link_next(Q9, Q13)
Q12.link_next("봉투만 전해도 OK", Q13)
Q13.link_next("필참", Q14)
Q14.link_next("필참", "봉투만 전해도 OK")



Main 로직

next_Q에 저장된 객체의 ask()메서드로 묻고, 다시 next_Q에 새로운 Question 객체를 저장한다. Q12~14를 통해 나온 결과(“필참” or “봉투만 전해도 OK”)가 나올 때까지 이 과정을 while문으로 반복한다.


next_Q = Q1.ask()
while ((next_Q != "필참") & (next_Q != "봉투만 전해도 OK")):
    next_Q = next_Q.ask()

congraturatory_money += Question.extra

print("=============================================")
print(f"내야할 돈은 {congraturatory_money}만 원!")
print(next_Q)
print("=============================================")





전체 코드

다음 노드로 이동하며 질문을 잇는다.


# 축의금 
congraturatory_money = 5

class Question :
    extra = 0 
    def __init__(self, Y_cost, N_cost, question) :
        self.Y_cost = Y_cost
        self.N_cost = N_cost
        self.question = question
    
    def link_next(self,Y_next, N_next) : 
        self.Y_next = Y_next
        self.N_next = N_next
        
    def ask(self):
        while True : 
            self.answer = input(f"{self.question} (Y/N)").upper()
            
            if self.answer == "Y" :
                Question.extra += self.Y_cost
                return self.Y_next
            elif self.answer == "N" :
                Question.extra += self.N_cost
                return self.N_next
            else : 
                print("'Y' 또는 'N'으로 입력해주세요")
                
Q1 = Question(1, 0, "최근 1년 간 청첩장이 아닌 이유로 만난 적이 있다.")  
Q2 = Question(1, 0, "청첩장을 직접 받았다.")  
Q3 = Question(-1, 0, "청첩장을 모바일로 받았다.")
Q4 = Question(0, 0, "인연을 맺은 지 5년 이상이다.")  
Q5 = Question(0, 0, "직장 동료다.") 
Q6 = Question(0, 0, "SNS 친구다.")  
Q7 = Question(1, 0, "자주 보는 사이다.")  
Q8 = Question(-2, 0, "이번이 재혼이다.")  
Q9 = Question(2, 0, "식장이 호텔이다.")  
Q10 = Question(-2, 0, "그로부터 상처를 받은 적이 있다.")  
Q11 = Question(-1, 0, "결혼 성수기다. ") 
Q12 = Question(-1, 0, "식장이 지방이다.") #  -> 봉투만 전해도 OK
Q13 = Question(2, 0, "나도 2년 안에 결혼할 예정이다.") # -> 필참
Q14 = Question(1, 0, "액수를 정했는데 뭔가 불안하다.") # -> 봉투만 전해도 OK

Q1.link_next(Q2, Q3)
Q2.link_next(Q5, Q3)
Q3.link_next(Q6, Q5)
Q4.link_next(Q7, Q9)
Q5.link_next(Q7, Q4)
Q6.link_next(Q11, Q5)
Q7.link_next(Q8, Q9)
Q8.link_next(Q10, Q11)
Q9.link_next(Q13, Q12)
Q10.link_next(Q12, Q11)
Q11.link_next(Q9, Q13)
Q12.link_next("봉투만 전해도 OK", Q13)
Q13.link_next("필참", Q14)
Q14.link_next("필참", "봉투만 전해도 OK")

next_Q = Q1.ask()
while ((next_Q != "필참") & (next_Q != "봉투만 전해도 OK")):
    next_Q = next_Q.ask()

congraturatory_money += Question.extra

print("=============================================")
print(f"내야할 돈은 {congraturatory_money}만 원!")
print(next_Q)
print("=============================================")