pt순위
<<<<<동아리 I/O 프로젝트 (2020)>>>>>
Lottery 2020
view : 33
추첨 프로그램 for 학교환경개선사업[/c2]
by 지도교사 S.K.Baek

2020년 6월말 경,
학교에서는 학교환경개선 사업 관련으로 학교공간에 대한 설문조사를 진행하였었고 그 설문조사에는 약 200여명의 학교 구성원이 참여하였습니다. 적극적인 참여를 유도하고자 설문참여자 중 뽑기(?)를 통해 소정의 상품을 지급하겠다고 홍보하였으며 설문조사 후 수집이 된 학생의 정보는 설문조사 시 입력한 이메일 주소 뿐이라 그것을 이용하여 추첨을 하기로 했습니다.
물론,
이메일 주소를 모조리 종이로 출력해서
가위로 싹뚝싹뚝 자른 다음
상자에 넣고 흔들어서 섞고
그 중 10장을 뽑아내는 방법도 있겠습니다마는...
명단은 csv 파일로 정리하였으며, 안의 내용은 데이터 마스킹(Data Masking, 개인정보 데이터 전부 또는 일부분을 공백ㆍ노이즈 등 대체값으로 변환하는 방법)하여 다음과 같이 준비하였습니다.
교사.csv
61****25
js*mm
yo*****07
94***h2
hr*****rr
yk*07
ss*********35
us****05
gr****sh
xh**yx
... # ..등등 총 46개

학생.csv
gn***49
ja*****14
ye****02
lg**52
mo**oy
yo******64
ci*******js
go*******30
qk************05
sa***69
... # ..등등 총 153개

추가 설치 과정 없이 python의 기본 모듈만으로 해결할 수 있는 프로그램을 만들다보니 굉장히 간단하게 만들어졌습니다. 대신 출력되는 모습도 많이 허전합니다.
import random, time
대상자명단=추첨번호=[]
파일이름=""

while (파일이름!="교사" and 파일이름!="학생"):
파일이름=input("누구를 대상으로 추첨하겠습니까? (교사, 학생) ")

추첨파일=open(파일이름+".csv", "r")
for i in 추첨파일.readlines( ):
대상자명단.append(i)

인원수=len(대상자명단)
추첨인원=int(input(파일이름+"의 "+str(인원수)+"명 중 몇 명을 추첨하겠습니까? "))
추첨배열=list(range(인원수))

추첨번호=random.sample(추첨배열, 추첨인원)

print("
+ + + + + "+파일이름+" 당첨자 ID + + + + +
")
for i in 추첨번호:
time.sleep(1) # 1초 멈춤
print(대상자명단[i])

추첨을 위해 가장 중요한 과정은 무작위 수를 뽑는 것입니다. 그 부분을 지원해주는 모듈이 바로 random 모듈입니다. time 모듈은 20번 라인의 time.sleep(1)을 사용하기 위해 포함시킨 것으로, 이것은 단지 추첨의 긴장감(?)을 높이기 위해 1초에 하나씩 출력되는 기능을 담당합니다. (^^)

5~6번 라인의 while문은 '교사'나 '학생'을 입력하기 전에는 계속 누구를 대상으로 추첨하겠습니까? (교사, 학생)을 물어보도록 합니다. '교사ˇ'나 'ˇ학생' 등 띄어쓰기가 들어가도 안됩니다. 약간의 코딩이면 수정할 수 있습니다. strip 등
파일이름=파일이름.strip()
8번 라인은 앞서 선택한 '교사'나 '학생'파일의 모든 내용을 추첨파일이라는 변수에 대입하는 과정입니다.

9~10번 라인에서는 readlines() 명령문을 이용하여 추첨파일 안의 내용을 한 줄씩 읽어 append()로 대상자명단 배열에 그 내용(각 문장)을 집어넣습니다.

12번 라인에서는 len()을 이용하여 대상자명단에 입력된 배열의 갯수를 파악합니다. 아이디의 갯수, 즉 설문조사에 참여한 사람의 수를 알아낼 수 있습니다.

13번 라인에서는 12번 라인에서 알아낸 인원수를 활용하여 학생의 153명 중 몇 명을 추첨하겠습니까? 라는 문장을 출력하고 숫자를 입력받습니다. 12번 라인에서 알아낸 인원수는 숫자int 형식의 자료입니다. 문장으로 연결하기 위해서는 문자열 형식으로 바꿔줄 필요가 있기 때문에 'str(인원수)'와 같은 조치를 해줍니다.

14번 라인에서는 list함수를 이용하여 인원수 만큼의 배열을 만듭니다. 만일 인원수가 10이라면 0부터 9까지 10개의 배열이 만들어집니다.
>>> 추첨배열=list(range(10))
>>> 추첨배열
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 추첨배열[0]
0
>>> 추첨배열[1]
1
>>> 추첨배열[9]
9
>>> 추첨배열[10]
Traceback (most recent call last):
File "", line 1, in
추첨배열[10]
IndexError: list index out of range
16번 라인에서는 random.sample() 함수를 이용하여 추첨배열의 내용 중 추첨인원(13번 라인에서 입력받은 숫자 내용) 수 만큼의 숫자를 무작위로 선택합니다. random 기능을 이용하면 무작위로 뽑다보니 같은 값이 다시 나올 수도 있지만 random.sample() 함수를 사용하면 중복되지 않는 값을 원하는 갯수만큼 선택할 수 있습니다.

>>> 추첨배열=list(range(10))
>>> 추첨배열
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.sample(추첨배열, 3)
[3, 4, 9]
>>> random.sample(추첨배열, 3)
[5, 1, 0]
18번 라인에서는 + + + + + 학생 당첨자 ID + + + + +와 같은 내용을 출력합니다.

19~21번 라인에서는 추첨번호 배열 안에 들어있는 내용(sample로 뽑아진 숫자값들)을 순서대로 대상자명단(9~10번 라인에서 만들어진 아이디 배열)에 적용하여 하나씩 출력합니다.

제작후기
원래 설문참여자 추첨은 학생이 만든 추첨 프로그램으로 진행하려고 했었으나 프로그램 제작에 대한 학생의 욕심이 점점 커지면서(unity도 건드리고, blender도 건드리고...) 제 시간 내에 할 수 없는 상황이 되어버렸고, 추첨 당일 아침에 급하게 만들어 진행을 하게 되었습니다.

유튜브 라이브로 진행하고 싶었으나 장비 및 수업 시간 등의 문제로 그냥 녹화로 진행되었습니다.

학생이 제작하고 있는 추첨프로그램을 기대합니다. 그 프로그램을 사용하게 될 때는 라이브로 진행할 수 있지 않을까 싶기도 하고... ^^

Lottery 2020
<<<<<동아리 I/O 프로젝트 (2020)>>>>>
76 (124) / 98 (164) / 46,181 (220,792)

since 2023.07.27
zackie class in korea = zclx.kr
since 2021.07.05 zackie school in korea = zskool.kr
since 2015.03.01 zackie school in korea = zskool.com