import itertools04wk-1: 퀴즈3
- 전북대 학생들을 시험당일 학생증을 지참할 것. (출석체크 및 본인확인) 학생증 외에 신분증 여권등도 가능.
- 부정행위 (카카오톡 채팅을 통한 코드공유, 생성형모델 사용, 대리시험 등) 적발시 F 처리함.
- 퀴즈 중 지각할 경우 지각사실을 기록함. 하지만 별 다른 감점은 하지 않음.
.ipynb파일 형태로 제출된 답안지만 채점하며 그 외의 형식 (.hwp,.py등)은 채점하지 않음. 즉 0점 처리함.
1. – 10점
4개의 문자 \(x,x,y,y\) 를 모두 일렬로 나열하는 경우의 수를 파이썬을 이용하여 구하여라.
itertools.permutations()을 이용할 것.
hint: 답은 \(\frac{4!}{2!2!}=6\) 이다.
(풀이)
len(set([''.join(i) for i in itertools.permutations('xxyy')]))
# len(set([i for i in itertools.permutations('xxyy')])) <-- 이렇게 해도 결과는 같음6
2. – 10점
리스트 컴프리헨션을 이용하여 \(a_n=\frac{1}{n(n+1)}\)을 만족하는 수열을 선언하라. (\(a_1,a_2,\dots,a_5\) 까지만 선언하면 정답으로 인정)
## 정답은 아래와 같음
[0.5, 0.16666666666666666, 0.08333333333333333, 0.05,
0.03333333333333333](풀이)
[1/(n*(n+1)) for n in range(1,6)][0.5, 0.16666666666666666, 0.08333333333333333, 0.05, 0.03333333333333333]
3. – 40점
(1)~(4) 까지 각 10점씩임.
(1) for 문을 사용하여 아래와 같은 수열을 정의하라. (\(a_1,\dots,a_{100}\) 까지 선언할 것)
- \(a_1=a_2=1\)
- \(a_{n} = a_{n-1} + a_{n-2}\) where \(n\geq 2\)
## 정답은 아래와 같음
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393,
196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887,
9227465, 14930352, 24157817, 39088169, 63245986, 102334155,
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903,
2971215073, 4807526976, 7778742049, 12586269025, 20365011074,
32951280099, 53316291173, 86267571272, 139583862445, 225851433717,
365435296162, 591286729879, 956722026041, 1548008755920,
2504730781961, 4052739537881, 6557470319842, 10610209857723,
17167680177565, 27777890035288, 44945570212853, 72723460248141,
117669030460994, 190392490709135, 308061521170129, 498454011879264,
806515533049393, 1304969544928657, 2111485077978050,
3416454622906707, 5527939700884757, 8944394323791464,
14472334024676221, 23416728348467685, 37889062373143906,
61305790721611591, 99194853094755497, 160500643816367088,
259695496911122585, 420196140727489673, 679891637638612258,
1100087778366101931, 1779979416004714189, 2880067194370816120,
4660046610375530309, 7540113804746346429, 12200160415121876738,
19740274219868223167, 31940434634990099905, 51680708854858323072,
83621143489848422977, 135301852344706746049, 218922995834555169026,
354224848179261915075](풀이)
an = [1,1]
for n in range(3,101): # range(2,100) 혹은 range(98) 을 써도 결과는 같음
an.append(an[-1]+an[-2])
#an(2) 3-(1)의 결과로 나온 숫자들의 자리수를 카운트하는 파이썬코드를 리스트 컴프리헨션을 이용하여 구현하라.
hint 3-(1)를 풀지못하였더라도 아래의 리스트를 입력하면 이 문제를 풀 수 있음.
lst = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393,
196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887,
9227465, 14930352, 24157817, 39088169, 63245986, 102334155,
165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903,
2971215073, 4807526976, 7778742049, 12586269025, 20365011074,
32951280099, 53316291173, 86267571272, 139583862445, 225851433717,
365435296162, 591286729879, 956722026041, 1548008755920,
2504730781961, 4052739537881, 6557470319842, 10610209857723,
17167680177565, 27777890035288, 44945570212853, 72723460248141,
117669030460994, 190392490709135, 308061521170129, 498454011879264,
806515533049393, 1304969544928657, 2111485077978050,
3416454622906707, 5527939700884757, 8944394323791464,
14472334024676221, 23416728348467685, 37889062373143906,
61305790721611591, 99194853094755497, 160500643816367088,
259695496911122585, 420196140727489673, 679891637638612258,
1100087778366101931, 1779979416004714189, 2880067194370816120,
4660046610375530309, 7540113804746346429, 12200160415121876738,
19740274219868223167, 31940434634990099905, 51680708854858323072,
83621143489848422977, 135301852344706746049, 218922995834555169026,
354224848179261915075]hint 아래의 코드를 이용할 것
len(str(2584)), len(str(354224848179261915075))(4, 21)
## 답은 아래와 같다.
[ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4,
4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7,
7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11,
11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14,
15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18,
18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21 ](풀이)
# [len(str(i)) for i in an](3) 3-(1)의 결과로 나온 숫자들의 유일한 숫자의 수를 카운트하는 파이썬코드를 리스트 컴프리헨션을 이용하여 구현하라. (여기에서 17711 은 유일한 숫자가 “1,7” 2개이며, 10946은 유일한 숫자가 “1,0,9,4,6” 5개 이다.
hint 아래의 코드를 활용할 것
len(set(str(9227465)))6
## 답은 아래와 같다.
[ 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2, 3, 3, 4,
4, 3, 3, 5, 2, 5, 4, 4, 4, 5, 4, 5, 5, 6, 7, 6, 5,
6, 7, 6, 6, 7, 6, 6, 6, 4, 6, 6, 6, 7, 8, 6, 7, 8,
7, 7, 6, 8, 7, 7, 7, 8, 8, 10, 9, 10, 9, 6, 7, 9, 8,
7, 8, 9, 9, 8, 10, 8, 9, 8, 8, 7, 8, 9, 8, 8, 8, 7,
9, 8, 7, 7, 9, 8, 10, 9, 9, 7, 9, 8, 10, 9, 10 ]문제의 뜻이 이해안되면 질문할 것
(풀이)
# [len(set(str(i))) for i in an](4) 3-(1)의 결과로 나온 숫자들 중 짝수에 해당하는 숫자가 몇개인지 카운트하는 코드를 작성하라. 코드 작성시 if가 포함된 리스트컴프리헨션을 이용하라. (numpy 이용시 부분점수 없이 0점)
(풀이)
len([i for i in an if i %2 ==0])33
4. – 40점
10원짜리 동전 13개, 100원짜리 동전 17개, 500원짜리 동전 4개가 있다고 하자. 이러한 동전들로 표현할 수 있는 돈의 액수는 모두 몇 가지인가? 파이썬의 itertools 모듈을 이용하여 count하라.
– 예시 –
10원짜리 동전 1개, 100원짜리 동전 5개, 500원짜리 동전 1개가 있다면 표현할 수 있는 돈은 아래와 같다.
| 경우 | 10원 | 100원 | 500원 | 총액 |
|---|---|---|---|---|
| 경우1 | 0 | 0 | 0 | 0원 |
| 경우2 | 0 | 0 | 1 | 500원 |
| 경우3 | 0 | 1 | 0 | 100원 |
| 경우4 | 0 | 1 | 1 | 600원 |
| 경우5 | 0 | 2 | 0 | 200원 |
| 경우6 | 0 | 2 | 1 | 700원 |
| 경우7 | 0 | 3 | 0 | 300원 |
| 경우8 | 0 | 3 | 1 | 800원 |
| 경우9 | 0 | 4 | 0 | 400원 |
| 경우10 | 0 | 4 | 1 | 900원 |
| 경우11 | 0 | 5 | 0 | 500원 |
| 경우12 | 0 | 5 | 1 | 1000원 |
| 경우13 | 1 | 0 | 0 | 10원 |
| 경우14 | 1 | 0 | 1 | 510원 |
| 경우15 | 1 | 1 | 0 | 110원 |
| 경우16 | 1 | 1 | 1 | 610원 |
| 경우17 | 1 | 2 | 0 | 210원 |
| 경우18 | 1 | 2 | 1 | 710원 |
| 경우19 | 1 | 3 | 0 | 310원 |
| 경우20 | 1 | 3 | 1 | 810원 |
| 경우21 | 1 | 4 | 0 | 410원 |
| 경우22 | 1 | 4 | 1 | 910원 |
| 경우23 | 1 | 5 | 0 | 510원 |
| 경우24 | 1 | 5 | 1 | 1010원 |
여기에서 경우2와 경우11은 중복이고, 경우14와 경우23은 중복이므로 총 22개의 경우가 나온다.
문제의 뜻이 이해안되면 질문할 것
(풀이)
lst10 = list(range(14))
lst100 = list(range(18))
lst500 = list(range(5)) len(set([i*10+j*100+k*500 for i,j,k in itertools.product(lst10,lst100,lst500)]))384