파이썬으로 수학문제(경우의 수) 풀기
인터넷 사이트에서 질문글이 올라왔는데 수학적 두뇌는 이과생으로서 부끄럽기 짝이없게 굳어버린 상태라.. 파이썬으로 풀어버렸다. 사실 경우의 수로 푸는 문제인데 문제는 이렇다.
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: 로 수정하여야 한다.
'Creation > Python' 카테고리의 다른 글
[Python DIY] 대량메일(일 500건) 발송 메뉴얼 (12) | 2014.02.27 |
---|---|
[Python] 한글로 된 메일 Gmail(지메일) 자동대량발송 하기 (1) | 2014.02.10 |
[Python] 파이썬으로 메일(Gmail) 대량발송하기 (0) | 2014.01.02 |
[Python] 파이썬을 이용한 Cookie 유지방법 (1) | 2013.11.06 |
[Python] 다운로드 %를 보여주는 urllib2를 이용한 인터넷 파일 다운로드 (1) | 2013.11.06 |