상세 컨텐츠

본문 제목

생활코딩 Project - 마니또 계산기 (VBA, Excel)

코오딩/생활코딩

by 쿠악룸푸르 2022. 5. 23. 18:38

본문

마니또 뽑기 / 나 자신을 뽑으면 슬프다..

마니또(Manito)

- [명사] 비밀 친구. 또는 제비뽑기 따위를 하여 선정된 상대방에게 자신의 정체를 숨기고 편지나 선물, 선행 등을 제공하는 사람. [네이버 국어사전]

- 2.제비 뽑기 등을 하여 지정된 친구의 수호천사가 되어주는 것. [네이버 오픈사전]

 

학생 때나 교회, 성당 등에서 한번쯤 해봤을지도?

 

아무튼 이 마니또를 해본 사람이라면

일정기간 누군가의 비밀친구이자 수호천사가 되어주는 취지에 맞지 않게

자기 자신을 뽑는 사람이 나온다는 문제점이 있다는걸 알 것이다..

 

성당에서 여러 번 마니또를 해봤는데 친구의 이름이 쓰인 쪽지를 뽑고

'음~ 누구의 마니또가 되었네' 라고 생각할 때 다음 사람이 '앗 나 나 뽑았어 ㅠㅠ' 하고

모두가 다시 뽑는 사태가 발생한 경험이 있었다.

 

이렇게 마니또 게임이 성립하기 위해서는

모두가 1대1 대응의 무언가를 중복 없이 뽑을 확률,

즉 '완전 순열' 공식을 만족해야한다.

조금 쉽게 설명을 해보자면

n명의 사람들이 쓰고 있는 모자를 벗고 섞은 다음 각자 모자를 1개씩 뽑을 때

자기 모자를 뽑은 사람이 없을 확률을 만족해야한다는 것이다!

 

결론부터 말하자면 n명의 사람 중 자기 모자를 쓴 사람이 없는 경우의 수

위와 같은 점화식이 된다.

 

D1 = 한 명이면 자기 모자를 쓸 수 밖에 없으므로 0

D2 = 두 명이면 서로 모자를 바꿔쓰는 경우의 수밖에 없으므로 1

D3은 위 점화식에 대응하면

D3 = (3-1)(1+0) = 2

 

D4도 위 점화식에 대응하면

D4 = (4-1)(2+1) = 9

 

이제 위에서 언급한 n명의 사람 중 자기 모자를 쓴 사람이 없는 경우의 수를 n명의 사람이 모자를 쓰는 모든 경우의 수(n!팩토리얼)로 나눠주면 마니또 게임이 문제없이 진행될 확률이 되게된다!

 

완전순열 공식

대충 수식을 때려보면 36.79%의 확률에 수렴하는 것을 확인할 수 있었다.

10명만 되도 경우의 수가 ㅎㄷㄷ... 하기 때문에 역시 기하급수는 무섭다라고 다시 생각하며

0.367879•••는 또 무슨 숫자인가 찾아보니 e(자연상수) 의 역수였다... 이 것도 무섭

 

그래서 말로 정리를 해보자면!

 

마니또 게임을 둘이서 뽑진 않을테니;;

최소 세 명 정도가 마니또를 뽑을때!

자기 자신을 뽑은 사람이 없을 확률은

약 36%이다.

즉 마니또 뽑기에 실패할 확률이 64%정도로 더 높다는 뜻이다.... 어쩐지... 한두번에 안끝난 적도 많았거덩...

 

그래서 이렇게 중복없이 / 사심없이 완벽하게 마니또를 지정해줄 프로그램의 필요를 느꼈다!

 


 

 

우선 완성된 마니또 계산기의 비주얼부터

 

마니또 계산기

요런 요런 느낌!

 

플레이어수는 번호열의 마지막 번호를 참조한다.

플레이어 이름만 작성하고 마니또를 구해줘 버튼을 누르면 플레이어 이름에 있던 이름들이 마니또 이름으로 중복없이 배치된다.(중복되면 연산횟수가 1회 늘어나며 중복 없을 때까지 루프)

TXT로 내보내줘 버튼을 누르면 내문서 폴더에 TXT 파일로 플레이어 별로 저장된다.

 

저장 형태
저장 내용

 

짜짠~

 

그래서 이 TXT파일을 진행자가 개인톡으로 플레이어에게 전달하고 진행자의 카톡방에서 삭제해주면!

완전범죄가 진행되는 것이다!

물론 TXT로 내보내기 전에 마니또 이름칸을 숨기기 열 처리하든 글자색을 흰색으로 바꾸든 하는 과정이 있어야 진행자가 마니또 매칭을 알 수 없겠죠..?

확인 열은 만일 플레이어 이름열과 마니또 이름열에 같은 요소가 있으면 1로 바뀌고 Done가 retry로 바뀜 사실 발생할 일은 없는데 테스트 용으로 만들어 둠

 

연산횟수는 한 번에 성공하면 1, 루프가 반복될때마다 1씩 증가하여

대충 여러분이 손으로 뽑기를 했으면 이렇게나 반복할 수도 있었다~ 라는 계산기 생색내기 용도이다.

테스트 하면서 8~9가 뜨는 경우도 봤다;; 실전이었다면 멘붕

 

플레이어는 일단 우리 단체에 맞춰서 명수를 지정했는데 이 이상 인원이면 결과 발표도 힘들고 마니또 진행에 애로사항도 많을 것 같아서 일단 제외했다..

숨기기열 보이게 처리하고 수식들 이해하신 분이라면 전혀 문제없이 수정이 가능하실테고!

 

인원 변경에 있어서

14명보다 적은 인원의 경우에는 그냥 열 삭제(버튼 없는 위치) 하고 마니또를 구해줘 버튼 여러번 눌러서도 야매로 가능하다.

14명 이상의 인원인 경우에는 표 중간에 행을 추가하고 15번열(O열) 의 SORTBY 함수 범위를 늘려줘야한다.

10열(J열)의 번호를 최신화 해주는 것도 당근

 

(사실 100행 정도 만들어두고 플레이어수에 직접 값 넣어서 or 플레이어 이름 있는 칸만 알아서 카운트해서 해당 인원으로 사용할 수 있게 한다면 진짜 자동화였겠으나... 생활 코딩은 역시 하드 피팅!)

 

올 여름 행사 마니또 진행에 있어 마니또 계산기가 큰 역할을 해주기를 기대한다!

 

보실 분이 있을 지는 모르겠지만 혹시 마니또 계산기 수정이 어려워서 사용못하겠다 하시는 분은 댓글 남겨주시면

인원수 맞게 수정해서 보내드릴게요!

 

질문도 언제나 환영입니다~

 


 

생활코딩 분야의 첫 글...

이런게 있다면 어떨까? 하는 부분에서 시작하는 게 재미있다.

문제는 항상 돈이지만!

엑셀과 파이썬을 위주로 하고 있는데 이 둘로도 가능한 것이 참 많은 것 같다.

다음 번엔 웹크롤러를 활용해서 어느 페이지를 요약하는 무언가를 만들어보고 싶다!

 

 

 

 

 

마니또계산기_배포용_20220523.xlsm
0.02MB

댓글 영역