2024년 1월 22일부터 26일까지 국민대학교에서 대학생 코딩 재능봉사 캠프를 진행한다고 하였다.
원래 코딩이나 컴퓨터, 보안에 관심이 있었고 방학동안 놀기만 할거같은 나는 이 소식을 듣자마자 신청해보았다!!
이 프로그램에서는 주로 파이썬의 문법과 활용법 등을 주로 배울 수 있었고, 인공지능, 메타버스 등 최신 기술들에 대한 수업과 체험도 준비되어 있어 많은 도움이 되었던 시간이었다.💯💯
첫날 2시간정도는 버스시간때문에 늦어버렸기 때문에(사실 버스 놓친거;) 프로그램OT를 듣지 못했다. 그리고 정신없이 뛰어왔기 때문에 사실 기억이 잘 나지 않는다...😥
메타버스 체험도 했다. 가상의 공간에서 캐릭터들을 이용해 만나 여러 방탈출도 해보고 미니게임도 즐겨보았다. 이번 캠프에서는 gather.town 이라는 웹사이트를 사용하여 메타버스를 체험해 보았다.
그리고 우리가 사용할 코드 편집기인 VSC(Visual Studio Code)와 우리가 배울 프로그래밍 언어인 Python도 다운을 받았다. 하지만 나는 이미 깔려있기 때문에 따로 다운받지는 않았다.
2일차부터 프로그래밍의 정의와, 우리가 배울 프로그래밍 언어인 파이썬의 특징 등을 살펴보았고, 간단한 입력(input)과 변수 할당, 리스트, 딕셔너리, 산술 연산자 등을 배웠다. 간단한 코드를 작성하는 것은 상당히 쉬웠다.
그리고 데이터 시각화 프로젝트도 진행했다. 아래 모듈을 사용해 데이터를 시각화해보았다.
위는 데이터를 분석한 그래프의 스크린샷이다.
보다시피 위의 지구 온난화의 영향으로 그래프의 방향이 점점 위를 향하고있는 것을 알 수있다.
특히 2000년 이후 온도 상승 속도가 더욱 가속화되는 모습도 확인할 수 있다.
시각화한 데이터는 1980년부터 2024년 1월까지 하루하루의 날짜, 평균온도, 최저온도, 최고온도가 표기되어있는 csv(comma-separated values) 파일을 사용했다.
csv파일은 각 열을 콤마로 구분하기 때문에, 데이터를 가공하고 분석하기 용이하다는 장점이 있어서 사용한 것 같다.
3일차부터는 슬슬 난이도가 올라간다.
사용자 정의 함수 def와 return을 사용하는 방법, 예외처리 함수인 try:, except: 등을 배웠다. 지렁이 게임도 체험해보았다. 아직까진 할 만 했었다😂
1. as
except ValueError as e:
이 코드는 예외처리를 할 때 사용되는 코드이다. except 함수는 ValueError 예외가 발생하면 실행되는 코드로, as를 사용해 ValueError 예외를 e에 저장한다.
2. 팩토리얼
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(int(input())))
이 코드는 어려운 처음 배우는 학생들에게는 어려울 수 있으므로 수업에서 뺀 것으로 보인다. 하지만 나는 이제 이해할 수 있기 때문에 이 글에서 설명한다.
이 코드는 인자 n
이 0이나 1이 아닐 때까지 자기 자신(factorial)을 계속 재참조(n
-1의 -1의 -1... 1)하는 함수이다.
n
이 1씩 계속 줄어들면 그 값은 함수 안에 있는 여러 함수에 return
값에 저장되고,
그 return
값이 1에 도달하개 되면 if
문에 막히게 되어 함수가 끝이나고,
return
값을 n
이 제일 작은 인자값을 가진 factorial(n)
함수부터 n
이 높은 순서로 return
값을 곱하게 된다. 💀💀💀
쉽게 말하면 5 와 (5-1)의 값과 (5-1-1)의 값과 (5-1-1-1)값과 1을 곱하는 것이다. (5-1-1-1-1)는 1이 되어 if문에서 1을 return한다
이 코드는 나도 이해하는 데에 조금 어려웠다. 하지만 이것을 보면 상당히 이해가 쉬울 것이다. (출처 : 나무위키)
어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이 세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네.
그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이 세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네.
그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이 세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네.
그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."재귀함수가 뭔가요?
"잘 들어보게. 옛날옛날..."
너무 재밌어서 가져와보았다🤣🤣🤣
??? : 이제 기본기를 쌓았으니 게임들을 만들 수 있겠지?!?!
아니다. 우리가 배운 것이 많기도 하고 실제 코드에 많이 쓰이지만 아직 많은 모듈과 더 많은 문법들이 기다리고 있기에, 코드를 따라 치고 코드를 해석만 하는 수업을 했다.
특히 Pygame이라는 모듈을 사용해 파이썬으로 게임을 만드는 과정은 파이썬을 처음 짜는 학생들에게는 어려울 수 있으므로 그냥 따라 치고 선생님이 이해하는 방향으로 수업을 진행한 것이다. 그리고 코드가 140줄이다;;
아래는 인게임 스크린샷이다.
게임은 pygame
모듈 내부 함수를 사용해 게임 화면을 띄웠고, Snake
, Apple
, Mirror
, Heal
, BACKGROUND_COLOR
의 색을 정의했다.
사용한 클래스는 아래와 같다.
사용한 클래스
Snake
)Apple
)Mirror
)Heal
)그리고 오브젝트를 생성하고 이벤트를 처리하기 위해 키보드 입력에 따라 뱀의 방향을 업데이트하고, 벽 충돌, 뱀 몸통과 머리 충돌, 아이템 충돌 등을 처리해 게임이 종료되도록 설정하였다.
게임은 간단해보이지만 생각보다 고려해야 하는 변수들이 많았고, 앞에 화면에 있는 코드를 그냥 옮기는 것도 힘들고 오래 걸리지만 실행해보니 오류들도 좀 있어서 몇십분동안은 트러블슈팅에 전념해야하는 경우도 있었다. 결국 오류를 고쳤고, 오류는 아주 사소한 부분이었다.😫 그래도 오류를 고치니 너무 뿌듯했다!!😎😎
4일차는 전에 쓰지 지렁이게임 코드를 작성하고, 드디어 팀프로젝트를 시작했다!
우리 캠프에는 13명이 있었는데, 1명이 출석하지 않아서 자동으로 팀 구성은 2인 1조가 되었다. 팀프로젝트는 6개 팀이 각각 문제를 받고 그 문제의 요구사항에 모두 충족하는 코드를 작성하면 되는 것이었다. 우리 팀의 이름은 한잔해찬 팀이었다🤣🤣
우리팀은 한x이와 나로 구성되었는데, 한x이가 파이썬을 어려워하는지 내가 짠 코드를 이해하기 힘들어보였다. 하지만 끝까지 열심히 이해해 발표까지 한 한x이에게 너무 고마운 마음이 든다👍👍👍
우리가 받은 문제는 바로 369 게임이다.
369 게임은 두 사람이 돌아가면서 숫자에 3이나 6이나 9가 들어가면 3,6,9의 개수만큼 박수를 치는 게임으로, 들어가지 않는다면 숫자를 말하면 되는 게임이다.
내가 짠 369 게임의 코드는 이렇다. (369_2.py)
def check(n): #함수 선언
count = 0 #3,6,9 개수 카운트 선언
for u in n: #str로 들어온 n은 '1','2' 형태로 저장된다
if u == '3' or u == '6' or u == '9': #순차적으로 가져온 u가 3,6,9일때
count += 1 #3,6,9 개수 카운트 1 증가, 아니라면 다음 자릿수 검증
if count == 0: #3,6,9의 개수가 하나도 없다면
return n #사용자에게 입력받은 n을 그대로 출력
else: #3,6,9의 개수가 있다면
return count*"짝" #함숫값으로 count의 개수만큼 "짝" 출력
t = 1 #시작 숫자
while True:
if t%2 == 0: #t가 짝수라면
print("컴퓨터 차례입니다 : ",check(str(t))) #짝수 t번째에 컴퓨터가 답하기
t+=1 #다음 차례로 넘어가기
else:
n = input("유저 차례입니다 : ")
if n == check(str(t)): #t번째에 함수 check의 값과 입력값 n이 같다면
t+=1 #다음 차례로 넘어가기
continue
else: #t번째에 함수 check의 값과 입력값 n이 같지 않다면
print("오답") #오답 출력하고
break #while 문 끝내기
파이썬이 어려운 사람에게는 상당히 어려운 로직일 수 있다.🤯🤯
(지금 나도 이해하라면 몇분 걸린다)
시작 숫자인 1을 t
라는 변수로 설정했다.
while true 파트
t가 짝수라면 컴퓨터의 차례이다. 컴퓨터가 check(str(t))
를 이용해 t번째 차례에 숫자를 문자열로 바꿔 모든 자릿수를 쪼개었고, 박수를 쳐야하는지, 숫자를 말해야하는지 검증해 알맞은 출력을 하도록 하였고, t
를 1만큼 증가시켜 차례를 넘겼다.
t가 홀수라면 사용자의 차례이다. 사용자의 입력은 n
이라는 변수에 저장하고, n
과 t
번째의 정답인 check(str(t)
를 비교해 정답이면 t
를 1만큼 증가시켜 차례를 넘겼다.
만약 정답이 아니라면(check(str(t)
)의 값과 n
이 다르다면), 오답을 출력하고 while
문을 빠져나와 게임을 종료시킨다.
def check(n) 파트
check(n)
은 인자값으로 n
을 사용한다.
사용자 입력값
n
과는 전혀 다른 값이다.
count = 0
for u in n: #str로 들어온 n은 '1','2' 형태로 저장된다
if u == '3' or u == '6' or u == '9': #순차적으로 가져온 u가 3,6,9일때
count += 1
위의 코드는 count
값을 0으로 초기화하고, 분리되어 들어온 n을 순차적으로 u
라는 변수명으로 저장해 꺼내어 if
문에서 검증한다.
for ~ in n 문은 n을 처음부터 끝까지 열거한다.
만약 u
의 값이 3이거나 6이거나 9이면, count
의 값을 1만큼 증가시킨다.
if count == 0: #3,6,9의 개수가 하나도 없다면
return n #사용자에게 입력받은 n을 그대로 출력
else: #3,6,9의 개수가 있다면
return count*"짝" #함숫값으로 count의 개수만큼 "짝" 출력
count
값이 0이라면(지금 차례의 숫자에 3,6,9가 하나도 없다면) 현재 차례의 숫자를 리턴하고(t
-> n
), 아니라면 count
의 개수만큼 짝을 리턴한다.
이 코드를 작성하기 위해서 생각보다 많은 시간이 소요되었다. 사실 나는 369 게임을 배정받자마자 "쉽네"라고 하였다.
코드를 작성하다가 머리가 터질것같았기도 하고, 작성한 코드를 갈아엎어 처음부터 다시 새로운 로직으로 작성하기도 했다.
하지만 선생님들의 도움과 코드에 대한 지적 덕분에 코드는 완성되어갔고, 올바른 출력을 할 수 있게 되었다!!👍👍
🙇♂️정말 감사합니다 선생님들🙇♂️
5일차에는 전날 완성하지 못한 369 게임을 완성했다. 완성된 코드는 완벽하게 작동했다.
코드를 발표하는 시간이 왔다. 우리 한잔해찬팀은 한x이가 발표를 하였는데, 발표실력이 너무 좋았다! 덕분에 우리 코드를 친구들에게 잘 이해시켜줄 수 있었다.
마지막 날은 점심으로 피자🍕와 치킨🍗을 먹었다. 머리를 쓰고 먹는 피자와 치킨은 맛이 없을수가 없었다...😋😋😋
맛있게 먹고 난 후 우리는 선생님과 작별을 했다.
선생님이 너무 잘 가르쳐주셔서 감사한 마음으로 떠날 수 있었다!
수고하셨습니다 선생님들!
2024 한국장학재단 동계 대학생 재능봉사캠프 in 성원고
20240122 ~ 20240126