본문 바로가기

Creation/Python

[Python] 1~9 까지 숫자 한번만 써서 푸는 수학문제 풀기





파이썬으로 수학문제(경우의 수) 풀기


  인터넷 사이트에서 질문글이 올라왔는데 수학적 두뇌는 이과생으로서 부끄럽기 짝이없게 굳어버린 상태라.. 파이썬으로 풀어버렸다. 사실 경우의 수로 푸는 문제인데 문제는 이렇다.


 OO

×   O

───

 OO

+OO

───

 OO


  에서 O에 1~9의 숫자를 한번씩 쓰는 것이다.

  경우의 수로 푼다면 굉장한 난관이 예상되는 문제인데, (사실 문제를 보다보니까 수학적 해법은 거의 없다고 봐야할 것이다.. 그저 대충 어느정도 까지 숫자가 들어가겠다구나 감이 오는 것 정도. 경우의 수를 줄이는 정도지 결과적으로는 대입해서 풀어야 한다.)

  그러나 파이썬으로 작성하면 1초만에 답이 나온다.


	
import sys
# a b
#*  c
#-----
#  de
#+ fg
#-----
#  hi
def main(args):
  for a in range(1,10):
    for b in range(1,10):
      for c in range(1,10):
        tmp = (a*10+b)*c
        if tmp < 100:
          e = tmp % 10
          d = (tmp - e) / 10
          for f in range(1,10):
            for g in range(1,10):
              tmp = d * 10 + e + f*10 + g
              if tmp < 100:
                i = tmp % 10
                h = (tmp - i) / 10
                mylist = [a,b,c,d,e,f,g,h,i]
                mylist = list(set(mylist))
                if len(mylist) >= 9 and mylist[0] != 0:
                  print [a,b,c,d,e,f,g,h,i]



if __name__ == "__main__":
    main(sys.argv) 
	


  주목해서 봐야 할 파이썬 함수는 mylist라는 list에 쓰인 함수일텐데,

  list(set(mylist)라고 하면 중복되는 변수들이 사라지면서 숫자 크기대로 정렬이 된다.

  따라서 이 상태에서 len함수로 9개의 숫자를 다 쓰고, 첫 숫자가 0이 아닌 것을 찾아내면 답이 나오게 되는 것이다.

  답은 [1, 7, 4, 6, 8, 2, 5, 9, 3], 즉, 17*4 = 68, 68+25 = 93 이것이 나오게 된다.


  사실 전공자들에게는 어려운 문제도 아니지만 평소에 머리 굴려볼만한 문제일 법 하다.




+ 추가 (Ian KIM님 제보)

  list(set(x)) 함수는 정렬함수가 아니다. 이 문제의 경우에는 운 좋게도 정렬이 잘 되지만 일반적인 경우에서 정렬함수는 아니다. 제대로 쓰려면 if len(mylist) >= 9 and 0 not in mylist: 로 수정하여야 한다.