04wk-1: 퀴즈3

Author

최규빈

Published

March 27, 2024

Caution
  • 전북대 학생들을 시험당일 학생증을 지참할 것. (출석체크 및 본인확인) 학생증 외에 신분증 여권등도 가능.
  • 부정행위 (카카오톡 채팅을 통한 코드공유, 생성형모델 사용, 대리시험 등) 적발시 F 처리함.
  • 퀴즈 중 지각할 경우 지각사실을 기록함. 하지만 별 다른 감점은 하지 않음.
  • .ipynb 파일 형태로 제출된 답안지만 채점하며 그 외의 형식 (.hwp, .py 등)은 채점하지 않음. 즉 0점 처리함.
import itertools

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