import itertools
04wk-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]
(풀이)
= [1,1]
an for n in range(3,101): # range(2,100) 혹은 range(98) 을 써도 결과는 같음
-1]+an[-2])
an.append(an[#an
(2)
3-(1)의 결과로 나온 숫자들의 자리수를 카운트하는 파이썬코드를 리스트 컴프리헨션을 이용하여 구현하라.
hint 3-(1)를 풀지못하였더라도 아래의 리스트를 입력하면 이 문제를 풀 수 있음.
= [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
lst 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개의 경우가 나온다.
문제의 뜻이 이해안되면 질문할 것
(풀이)
= list(range(14))
lst10 = list(range(18))
lst100 = list(range(5)) lst500
len(set([i*10+j*100+k*500 for i,j,k in itertools.product(lst10,lst100,lst500)]))
384