첫번째 프로젝트: 끝말잇기

Da Woon Kim·2023년 11월 25일
1

PostProject

목록 보기
7/7

프로젝트를 시작하며

부트캠프에서 처음으로 시작했던 개인 프로젝트, 솔직히 파이썬에 대해 공모전 출전과 자료구조 공부와 코딩테스트 준비로 인해 다양하게 활용해봤기 때문에 어느정도 자신있었다. 하지만 파이썬에 대해 알려주는 강의를 들으면 들을수록 내가 몰랐던 강의가 진짜 많았다. Django를 스스로 찾아서 공부해봤을 때 이런 기능을 직접 구현할 수 있나? 싶을 정도로 신기하고 다양한게 많았다.

처음 접해보는 파이썬의 모듈

실제로 공모전이나 경진대회를 진행하다 보면 데이터가 정해진 대회도 많았지만 그렇지 않은 대회도 많았었다. 아이디어 경진대회 같은 경우 어떻게 저런 데이터를 구할 수 있었지? 라는 생각을 자주하였고, 직접 분석한 모델의 시연도 페이지로 만드는 것을 보고 저런것까지 어떻게 스스로 진행할 수 있을까? 라는 질문을 가지게 되었는데 이번 부트캠프 과정을 통해 그 과정을 어느정도 깨달을 수 있었다.

Selenium

이 모듈은 파이썬으로 페이지를 크롤링 할 수 있는 모듈 중 하나라고 한다. 다양한 페이지의 내용을 html언어로 되어있는 곳에서 원하는 데이터를 찾아 가져오는 기능중 하나라 생각이 들었다. 프로젝트에 활용하려 시도 해보니 동적 움직임 또한 코드로 구현이 가능했지만 다른 기능이 필요했기에 이 기능은 프로젝트에 반영하지 못했다.

Flask

이 모듈은 Django를 떠오르게 했던 모듈이었다. SQL lite를 활용하여 데이터를 저장하고 페이지에서 받아들이거나 페이지로 올려보내는 역할도 해주는 백엔드 담당 툴이었다. Django랑 코드 모양은 다르지만 쓰임새나 활용할 수 있는 기능은 비슷했고 확실히 알아두면 다양한 기능을 구현하는데 도움이 되는 기능이 많았다. 하지만 나의 프로젝트인 끝말잇기에서는 사용할 일이 없었다. 끝말잇기에서 로그인을 하는 경우는 온라인으로 진행하는 것 이외에는 별로 필요 없어 보였다.

Open API

이것은 모듈은 아니었다. 공공데이터나 각종 홈페이지에서 불러올 수 있는 데이터를 활용하기 위해 사용하는 키와 같은 것이였다. 이번에 진행했던 끝말잇기 프로젝트에서 이 기능을 많이 활용하였다. 언제 한번 해봤던거 같은데 그땐 아무것도 모르고 그냥 따라만 했는데 이번엔 기능을 이해하면서 해보니까 기억에도 어렴풋이 남은것 같다. 표준 대국어사전 홈페이지에서도 이 기능을 활용하니 내가 원했던 끝말잇기를 만드는데 활용할 수 있을것 같았다.

끝말잇기 선택 이유

다양한 프로젝트 주제가 있었다. 내가 원하는 주제에 대한 신문 스크랩, SRT와 같은 자동 티케팅 등등 여러가지 기능이 있었는데 끝말잇기는 우리가 흔히 접할 수 있는 놀이 중 하나이기도 하면서 제일 쉽게 구현할 수 있을것 같았다. 원소 주기율표에서 볼법한 한방 단어들을 어느정도 알고 있었으니 사전에서만 나온다면 한방으로 이길 자신도 있었고, 상대방이 곤란할 것 같은 '역'으로 끝나는 말을 계속해서 준다면 당황하면서 게임을 이길 수 있었기 때문에 자신있는 종목을 직접 구현해 보고 싶었다.

프로젝트

끝말잇기를 시작하기 위해 어떤 방식으로 진행 할 것이며 어떻게 결과가 나야 승패 판정을 진행할 것인지 필요했다. 따라서 기능과 승패 판정 방식에 대한 메인 알고리즘을 먼저 생각했다.

끝말잇기 진행 알고리즘

끝말잇기를 시작하게 되면 진행할지 말지 받아들이는 것을 먼저 생각하였다. 따라서 다음과 같은 알고리즘을 생각하였다.

다음과 같은 방법으로 계속해서 끝말잇기를 진행할 수 있도록 진행하였다. 실제적으로 저장되어 있는 데이터를 부르고 저장하는 과정과 끝말잇기 자체를 시작하는 것을 제외한 나머지 과정을 나타내긴 했지만 메인에서는 이정도 기능만 존재하면 기능의 반을 구현한 것이라 볼 수 있다.

3번정도 오타를 내거나 Y/N 을 입력하지 않으면 자동으로 종료하게 되게끔 구현하였지만 순서도 알고리즘에는 표현하지 않았다. 지저분해 보인다. 다음으로 끝말잇기 자체 규칙과 구현 순서도를 나타내 보기로 한다.

끝말잇기 규칙

끝말잇기 규칙은 다음과 같다.

  1. 사전에 등재된 명사여야 합니다
  2. 적어도 단어의 길이가 두 글자 이상이어야 합니다
  3. 이미 사용한 단어를 다시 사용할 수 없습니다
  4. 두음법칙 적용 가능합니다 (ex. 리-> 니)
  5. 첫턴 한방단어는 불가능합니다.
  6. 게임당 경고 3회시 패배입니다.
  7. Y/y를 입력하면 끝말잇기가 시작되며 N/n을 입력하면 끝말잇기가 종료됩니다.
  8. 첫 턴에 단어를 인식하지 못할 수 있습니다.
  9. 입력한 이후 오래걸리는 경우가 있습니다. 이 경우 크롤링을 하느라 시간이 걸리므로 잠시 기다리시면 정상작동 됩니다.
  10. 오류 발생시 잠시 기다렸다가 다시 실행하시면 됩니다.

이 내용 또한 규칙을 확인할 수 있게끔 처음부터 보여주었다. 어딜가나 규칙에 맞는 과정을 진행해야지 안그러면 판정 자체가 애매해지기 때문이다. 따라서 전체적으로 진행할 규칙에 대한 내용을 구현해야 한다.

또한 두음법칙을 허용하는 경우가 있다. 따라서 두음법칙을 허용하는 경우 두음법칙을 적용한 단어와 적용하지 않은 단어 모두를 허용해줘야 한다.

끝말잇기 적용 알고리즘

사용자는 규칙에 맞게 다음과 같은 규칙을 위배하지 않는 단어를 입력해야 한다.

Rule
1. 앞 글자가 맞지 않으면 안된다.
2. 한번 게임에서 사용했던 단어를 재사용하면 안된다.
3. 첫 턴 한정 한방단어를 입력하면 안된다.

이후 다음과 같은 흐름으로 단어를 확인한다.

이렇게 사용자와 Bot의 티키타카를 진행하다 게임이 종료되면 메인 프로세싱으로 넘어가는 방식을 선택한다.

프로젝트를 마치며

프로젝트를 진행해 봄으로써 되게 재밌는 기능의 구현과 여러가지 의의, 그리고 아쉬웠던점이 존재하였다.

의의

끝말잇기에 대해 간단하게 생각했지만 다양한 기능을 구현해야 우리가 흔히 설정하고 진행할 수 있던 끝말잇기를 할 수 있었다. 따라서 각 기능마다 구현을 해서 적합시켜야 하는데 이러한 알고리즘의 결합을 계속해서 생각해야 하기 때문에 다양한 경우를 고려하여 진행하는 방향과 함수화에 대해 더 많은 깨달음을 얻어갈 수 있었다.

또한 이 프로젝트를 진행하면서 vscode를 처음 써보게 되고 poetry를 직접 만들어 적용해보는 시간을 가질 수 있었다. poetry는 현업에서 최근 많이 쓰이는 기능이라 회사에 업무를 진행할 때 큰 도움이 될것 같았다.

아쉬운점

이 프로젝트에서 아쉬운 점은 나의 능력한계였다. 폼을 만들어 여러 기능 중 끝말잇기로 넘어가는 기능 구현을 하고 싶었는데, 스스로 짧은 기간에 만들게되어서 더 많은 기능을 넣지 못한게 아쉬웠다. 사실은 어느정도 귀찮아서 미루고 미루다 이렇게 된것도 있다.

또한 추가적으로 SRT예매하기 기능도 구현해놓고 싶었다. 실제로 나의 주변사람들은 콘서트나 경기, 기차표와 같은 예매 시스템을 자주 사용한다. 이 기능 또한 내가 제일 구현해보고 싶었던 기능 중 하나였다. 이와같이 다양하게 배운 툴을 활용하여 더 많은 기능을 구현해내고 싶었다.

코드 및 설명: github

profile
Data Science를 정복하기 위해 기록용 Velog

0개의 댓글