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

Posted by Readiz
2014.02.16 16:52 Creation/Python





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


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


 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: 로 수정하여야 한다.


저작자 표시 비영리 변경 금지
신고
이 댓글을 비밀 댓글로
  1. 문제가 재밌어보여 함 풀어봤어여.

    http://jinnic.tistory.com/31
    • Ian KIM
    • 2014.02.20 14:09 신고
    mylist[0] != 0 가 검사되려면 리스트 변환후 sort() 해줘야 될거 같아여.
    • list(set(x))함수가 말씀하신 기능을 하고 있지요.. ㅎㅎ
    • Ian KIM
    • 2014.02.20 14:41 신고
    딴지는 아닌데요...

    >>> l = []
    >>> l.append(99)
    >>> l.append(4)
    >>> l.append(55)
    >>> l.append(33)
    >>> l.append(78)
    >>> l.append(2)
    >>> print l
    [99, 4, 55, 33, 78, 2]
    >>> set(l)
    set([33, 2, 99, 4, 78, 55])
    >>> list(set(l))
    [33, 2, 99, 4, 78, 55]
    >>> ll = list(set(l))
    >>> print ll
    [33, 2, 99, 4, 78, 55]

    제 Python IDE에서 실행 시킨 결과 입니다.
    python set 또는 list 메서드는 자동으로 sort 된다고 정의 되있지 않습니다.
    내부 구현에 의해 어쩌다 sort된다고 해도 그걸 믿고 쓰는건 좋은 방법 같지 않습니다.

    차라리 if 0 in XXX 같이 검사하는게 맞지 않을까요?
    • 그러네요. 작성하신대로 하니까 순서가 어긋나는군요.
      글 수정 했습니다.
      그런데 10 이하의 경우에는 왠지 모르겠는데 정렬이 잘 되네요 ㅋㅋ

      Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win
      32
      Type "help", "copyright", "credits" or "license" for more information.
      >>> a = []
      >>> a.append(9)
      >>> a.append(4)
      >>> a.append(6)
      >>> a.append(3)
      >>> a.append(7)
      >>> a.append(2)
      >>> a.append(0)
      >>> list(set(a))
      [0, 2, 3, 4, 6, 7, 9]
      >>>


      좋은 정보 감사합니다. 일반적으로 적용시키려면 따로 소트함수를 적용시키는게 맞군요. 부끄럽네요 ^^;
    • Ian KIM
    • 2014.02.21 09:04 신고
    "0 not in mylist" 가...
    ^^;;
    • 에구 ㅋㅋㅋㅋ 수정했어요. ㅎㅎㅎ
      확실히 제대 후에 돌대가리가 됐나봐요 ㅠㅠ
  2. 혹시 더하기 자리에 빼기도 가능할까요?
  3. 곱하기 빼기 숫자 중복없이 답이 나올까요?
    만약 안된다면 더하기 빼기는 가능할까요? 급해서요 부탁드릴께염

티스토리 툴바