올해 2018 아해 해커톤은 누리카베라는 게임을 해커톤으로 진행 하기로 했다.
누리카베에 대한 게임의 설명은 다음 사이트에 잘 나와있다.
https://ko.puzzle-nurikabe.com/
누리카베를 위 사이트에서 크롤링하고 이미지를 OCR로 변환한다음 Map을 DB에 Insert 하는 서버.
서버에서 데이터를 받아와서 문제를 푼 사용자에게 Ranking을 매기고 계산하는 Front.
또 인원을 나누어 팀끼리 퍼즐을 풀어내는 Client까지 계획했다.
예상되는 시스템 구성은 다음과 같은데
팀 공통 주제 중 내가 맡은 건 크롤러가 가져온 데이터를 파싱해서 db에 insert 하는 부분이었는데
2가지 방법을 생각했다.
1)
div값 좌표를 크롤링
크롤링 된걸 데이터화
데이터 insert
2)
크롤링으로 이미지 캡쳐
ocr - 크롤링 된걸 데이터 화
데이터 insert
2번의 경우는 이미지를 캡쳐하는 라이브러리, OCR 라이브러리 두가지의 사용법을 알아야 해서
빠르게 진행하는 해커톤에 맞지 않아 30분만 살펴보고 쉽지 않을것 같으면 바로 1번으로 바꾸기로 했다.
쉽게 되지 않을것 같아서 2번으로 진행했고 총 3명의 팀원이서
각각 jhipster로 환경구축, 데이터 크롤링, 크롤링 한것을 db형식에 맞게 파싱.
프론트와 독립적으로 진행되기 때문에 디비 구조 부터 잡았어야 했는데 구조는 다음과 같이 잡았다.
숫자가 있는값은 숫자로 될 수 있도록 했고,
1~XX 까지는 쓰일 수 있는 숫자여서, 빈칸 -1, ㅁ-> 0 , 숫자 -> 숫자 이런식으로 설계했다.
크롤링 개발과 독립적으로 파싱하는것을 만들기 위해 누리카베 사이트를 살펴봤는데
소스코드를 보면 다음과 같이 되어있다.
div 클래스 이름으로 각각 어떤 상태인지 구분 할 수 있었다.
\* cell selectable cell-off - 흰벽
\* nurikabe-task-cell wall - 점선벽
\* nurikabe-task-cell - 숫자
파싱을 할때 html -xml 파서를 이용했어야 했는데 몰라서 String을 split 로 짤라서 구분했다.
줄바꿈은 top의 px가 달라지면 줄바꿈으로 인식하도록 했다.
그런데 문제가 된게 빈칸은 똑같은 줄에 있더라도 px가 달랐는데 이는 누리카베 경계가 되는 선
때문에 같은 줄에 있어도 px 차이가 났다.
해결책은 top 픽셀값이 +-2 가 넘어가면 줄바꿈으로 인식되게 수정했다.
파싱 개발을 다 마치고 누리카베 문제 풀이에 들어갔는데 팀원들과 회의를 하는데 의견은 대충
나 : 패턴으로 검색
호훈님 : 전체를 검색
PM 의견 : 패턴으로 하는 팀은 있고, 어떤 문제는 전체를 대입해 봐야 하니 전체 패턴을 찾고 소거법으로 제거 해 가자.
결론은
맵에서 좌표, 숫자를 추출해내자.
숫자로 표시된 타일의 갈 수 있는 모든 경우의 수 추출.
2번에서 구한 경우의 수가 1번에 경로에 있으면 삭제
3번에서 나온 경우의 수와 다른 숫자의 경우의 수의 교집합을 찾음.
나온 교집합들에 게임룰을 적용해서 안되는 패턴을 제거한다.
이렇게 나온 순서도를 서로 팀원들과 나누어 진행했는데 이런 문제는 많이 풀어보지 못해서 생각보다 시간이 엄청 오래 걸렸다.
먼가 항상 기술 공부만 해서 이렇게 어떤 자료구조를 쓰고 어떻게 값을 수정하고 이런걸 많이 안해보니깐 퍼포먼스도 안나오고 그래도 4년차인데 내가 신입때 생각했던 4년차의 퍼포먼스가 나오지 않는것 같다. 문제는 알고 있는데 고치지 않으면 발전이 없는데 발전없이 살고 있었던것 같다. 어디가서 개발자라고 하기에 창피한 실력인것 같다. 그래도 더 기간이 지나기 전에 알아차릴수 있어서 다행이다.
—- 마지막으로 해커톤을 참석하신 분들의 후기 —-
종인 - 1박2일이라 컨디션 조절을 좀 신경안써서 좋았다. 2박3일이면 쪽잠 자고 해야겟다 생각… 이번밤만 지나면 끝이니깐.. 좀 더 열심히 했다. 다른걸로 시간을 안뺏겨서 좋았다. 환경설정 등등
먹을것도 먹었고 투덜거림이 없음. 다른 사람과 커뮤니케이션 못한게 아쉽. 알고리즘.. 힘들었다 재미있고 머리 안터지는걸로…. 알고리즘 준비 안했으면 무의미 했다.
호훈님 - 괜찮았다… 팀안에서 이해 수준이 비슷해서 좋았다. 진행이 수월했음. 처음에 목적이 알고리즘이 었는데.. 다른거에 시간을 뺏겨서 아쉽다. 결론적으로 안써먹다. 주제에만 집중하면 좋았을것.
근열님 - 행사가 처음이라 새롭기도 하고 배울점이 많았음. 해보지 않았던걸 해서 재미있었는데 이해 못하는것도 많았음. 평균적인 실력이 부족한거같아 힘들었다. 전체적으로 빨리 진행해야 하는데 못해서 힘듬. 개선 할 점은 개인적인 역량이 조율이 되서 행사진행 할때 원활 했으면 좋겟다.
홍신님 - 안해봤던것들 jpa같은 것들 사용법을 경험해본것이 좋았다. 필요한 기술 스택을 몰라 진행하는데 쉽지 않았다. 일주일 전에 예비 모임을 가졌으면 좋겟다. 누리카베에 대한 기획이나 처음에 세팅, 준비해야할것들 시간을 줄이고 실제로 계획을 더 많이 세웠으면 좋을것 같다. 준비없이 해서 민폐인것 같다.
문겸님 - 새로운 기술 몰랐던거 접해볼수 있어서 좋았음. 새로운 걸 시도 할때 주목적이 알고리즘이었는데 환경설정에 오래 걸려서 정작 알고리즘 구현하는데 힘들었음. 개선할점은 필요한 부분 같은 걸 사전모임으로 최소 기술 스펙정도는 보고 올 수 있을정도로 하면 좋을것 같다.
민수님 - 팀원 세분이 새로운걸 도전했고, 피드백이 좋아서 만족. 팀원이 접해본것만 해도 만족. 시간적인 부분을 보면 새로운 기술이 아니라 서로 잘 아는걸로 프로토 타입을 만들었으면 빨랐을것 같다. 스프링5 쓰면 머 하지도 못했을것. 초점을 잘 캐치 하지 못한것 같다. 이해 못하거나 커뮤니케이션 부분들에 있어서 수정하는데 시간이 오래 걸렸다. 작년에는 멀 해야할지 머리속에 그려졌는데, 구현 방식을 몰랐다. 이번에는 뭘 해야할지 감이 없었다. 이번이 어려웠던 시간 이었음. 목표를 정하고 각자 할 수 있는 기술로 하면 달라지지 않았을까…
경운 - 알고리즘이라 힘들었음. 같이 일하는 사람들 실력을 파악할수 있어서 좋았음.
성현 - 난 완성 다함. 못써봐서 아쉬움. 행사를 유지 하고 있는것만 으로 좋음. 협업을 하지 않음. 다 자서 나도 잤음. 완성을 못하고…. 아쉬움. 다들 뭐 했나….. 어떻게 소개 시켜줄지 걱정스러움. 내년부터는… 침대있는곳 안되겟다… 마음가짐도 중요할것 같다. 비싼 개발자들 일 안해서 고민중…. pm의 욕심이 과하지 않았나… 개인적 목표는 치고박고 싸우고 안해봤던거 하고 다른사람들 보고 배우고 팔로업도 해주고… 팀끼리 잘된것 같다. si개발자들 안해본것 해봐서 좋았음.
스터디 한 걸 많이 집어 넣지 못함. 팀끼리 경계선을 볼 수 있어서 좋았다. 개인적으로 만족스럽지 않음. 배워가는 느낌이 있엇는데… 그런게 없었음.