관리 메뉴

개발자비행일지

파이썬 부등식 본문

▶ Python

파이썬 부등식

Cyber0946 2020. 7. 7. 11:25

수량 사이의 대소 관계를 부등호를 사용해서 나태내는 식을 부등식이라고 한다. 

다음의 문제를 통해 알아보자

문제: 60L의 물이 들어 있는 600L 용량의 욕조에 물을 더 받으려 한다. 분당 30L 씩 받을 수 있다고 할 때,

언제 가득차게 되는가 ??

이 문제는 다음의 부등식을 통해 해결가능하다. 

  • 60+30x <600

 

이걸 파이썬의 for문과 if문을 사용해서 구해보자. 

import numpy as np
# numpy 모듈을 임포트 해준다. 

x = range(0, 1000)
a = []
for i in x:
    if 3*i + 60 < 600:
        a.append(i)
    else:
        pass
        
print(max(a))
# 부등식을 만족하는 값들 중에 가장 큰 X값을 출력해 준다. 

 

이제 for in과 if 문의 조합으로 한줄로 표현해 보자.

import numpy as np
x= range(1000)
a= [i for i in x if x*3 + 60 <6000]
#a는 리스트 x의 원소중 3x +60 <6000을 만족하는 원소만 뽑아서 만든 리스트이다.
print(max(a))

마지막으로 filter 와 lambda로 부등식을 풀어보자.

import numpy as np
x2 = np.arange(0,1000)
b = list(filter(lambda x: 3*x+60 < 600, x2))
#1)lambda 함수를 사용해서 3x+60 <600 을 만족하는지 확인한다. 
#2)filter 함수를 적용해서 x2를 대상으로 부등식을 만족하는 원소만 필터링한다. 
#3)해당 원소만 리스트 b로 만든다.
print(max(b))
#4)제일 큰 원소를 출력한다. 

자 이제 이것을 활용해서 임의의 일차 부등식  문제와 정답을 출력하는 파이썬 프로그램을 만들어 보자. 

import numpy as np

class Inequality:
    def __init__(self):
        self.a = 0
        self.constant = 0
        self.coefficient =0
        self.symbol1 =""
        self.symbol2 =""
        print('x는 -10 부터 10까지의 정수이다. 다음 부등식을 만족하는 x를 구하시오.')

    def question(self):
        self.coefficient =0
        self.constant = np.random.randint(low = -10, high =10, size = 2)
        #2개의 난수를 발생시킨다.
        while self.coefficient == 0:
            self.coefficient = np.random.randint(low =-10, high =10)
        self.a = np.random.randint(4, size=1)
        #부등호를 표현하기 위한것 case

        if np.random.randint(2) == 0:
            self.symbol1= "+"
        else :
            self.symbol1= "-"
        if self.a % 4 == 0:
            self.symbol2 = '>'
        elif self.a % 4 == 1:
            self.symbol2 = '>='
        elif self.a % 4 == 2:
            self.symbol2 = '<='
        elif self.a % 4 == 3:
            self.symbol2 = '<'

        print('{}x {} {} {} {}'.format(self.coefficient,self.symbol1,self.constant[0], self.symbol2,self.constant[1]))
    def answer(self):
        if self.symbol1 == '-':
            self.constant *= -1

        if self.a%4 == 0:
            y= list(filter(lambda a: self.coefficient*a+self.constant[0] > self.constant[1],np.arange(-10,10,1)))
        elif self.a%4 ==1:
            y= list(filter(lambda a: self.coefficient*a+self.constant[0] >= self.constant[1],np.arange(-10,10,1)))
        elif self.a%4 ==2:
            y= list(filter(lambda a: self.coefficient*a+self.constant[0] <= self.constant[1],np.arange(-10,10,1)))
        elif self.a%4 ==3:
            y= list(filter(lambda a: self.coefficient*a+self.constant[0] < self.constant[1],np.arange(-10,10,1)))
        print(y)


if __name__ == "__main__":
    def print_menu():
        print("1. 문제출제")
        print("2. 종료")
        menu = input("메뉴선택: ")
        return int(menu)

    def run():
        while 1:
            q1 = Inequality()
            menu = print_menu()
            if menu == 2:
                break
            elif menu == 1:
                q1.question()
                print("풀이를 완료하셨으면 y를 입력해 주세요")
                check_ans = input("풀이완료여부: ")
                if check_ans == 'y' or check_ans == 'Y':
                    q1.answer()
            else:
                print("잘못된 입력입니다. 다시 입력해주세요")
                run()
    run()

 

프로그램을 실행하면 다음과 같은 양식으로 출력되고 1 메뉴를 통해 문제를 생성하고 문제 풀이가 끝나면 y를 통해서 정답을 확인할 수 있는 방식의 프로그램이다.