알고리즘 문제해결/solved.ac

여름 엽서 꾸미기 이벤트 회고

havana723 2022. 8. 1. 14:07

종료된 이벤트입니다.

여름 엽서 꾸미기 이벤트가 종료되었습니다. 다들 재밌게 즐기셨나요?

 

솔브드에서 처음 시도해보는 형태의 이벤트였는데, 지금까지의 모든 이벤트가 그랬지만요 여러 일들을 거친 끝에 그래도 무사히 종료되어서 다행이라고 생각합니다.

 

이번 이벤트는 지금까지의 이벤트와 다른 점들이 꽤 있었기에, 이벤트의 뒷사정을 살짝 알려드리고자 간단한 회고를 작성해봅니다.

 

트리 꾸미기

사실 비슷한 형태의 이벤트 기획은 꽤 오래 전부터 있었습니다. 본래 이벤트 초안은 '트리 꾸미기' 였는데, 이름에도 알 수 있듯이 크리스마스 때 기획된 이벤트였습니다.

 

'트리 꾸미기'는 완전 이진 트리가 주어지고 트리의 각 노드에다가 문제를 풀어서 받은 오너먼트를 끼워넣는, 엽서 이벤트와 크게 다르지 않은 이벤트였습니다.

 

다만 그 때 추가로 만들고 싶었던 요소는 트리 업그레이드였습니다. 처음에는 depth가 1인 완전 이진 트리로 시작하여 포인트를 모아 depth를 늘려나가고, depth가 큰 트리일수록 보너스 점수를 주는 구조를 생각했었는데 귀찮고 엽서에 마땅히 적용할 방법을 찾지 못해서 이번 이벤트에는 빠지게 되었습니다.

 

아직도 버리기에는 아까운 기획이라고 생각하는데 올해 크리스마스에 다시 만나 볼 수 있을까요?

 

이벤트를 열기 전에

크리스마스 이벤트 만들어야지 하고 귀찮아서 못 만든지 어연 반 년, 방학을 맞아 심심해진 저는 이벤트를 열기로 결정했습니다.

 

이벤트를 열기 위해서는 다음과 같은 것들이 필요합니다.

  • 이벤트 기획
  • 리소스
  • 보상

 

이 중에서 기획은 이미 있는 '트리 꾸미기'를 쓰기로 했고 리소스는 제가 했던 낙서를 다시 제대로 그려서 사용하기로 했습니다.

 

강남 모 카페의 타블렛에 그린 이벤트 일러스트 초안

 

완성본보다 초안이 마음에 드는데, 이건 그림을 그리다 보면 항상 있는 일인거 같습니다. 슬퍼요.

 

아무튼 기획과 리소스는 어느 정도 준비가 되었고 남은 것은 보상이었습니다. 배경과 뱃지는 간단히 생각할 수 있는 보상이었고 실제로 리소스가 있는 상황에서는 코스트가 크지 않기 때문에 보상으로 설정하게 되었습니다.

 

그 외에 상위권을 노리고 싶어지면서 너무 경쟁이 과열되지 않을 보상이 무엇일지 고민했고 한별이 실물 엽서로 결정하게 되었습니다. 한별이를 좋아하시는 분들만 열심히 참여할 거라고 생각했는데... 뒤에도 언급하겠지만 생각보다 경쟁이 치열해서 놀랐습니다.

 

이벤트 준비

이벤트를 열기로 했으면 여러 준비들이 필요합니다. 우선은 기획을 구체화하기로 했습니다.

 

밸런싱

뼈대는 만들어져 있었기에 보너스 조건들과 밸런싱에 집중했습니다. 가장 먼저 나온 조건이 전부 같은/다른 티어와 전부 같은/다른 모양이었습니다. 해당 조건들을 기반으로 다른 조건을 정했고 전부 다른/같은 모양이 현실적으로 가능하려면 5개보다 많은 모양이 있으면 안 된다고 판단하여 엽서에 붙일 스티커의 갯수를 5개로 정했습니다. 사실 원래 기획은 스티커 9개였는데... 이랬으면 이벤트가 훨씬 더 하드코어해졌겠죠? 그렇게 하지 않은 것을 다행이라고 생각해요.

 

밸런싱은 어려운 문제였습니다. 이번 이벤트의 목적은 아래와 같았습니다.

 

  1. 문제 푸는 것이 조금 더 재밌었으면 좋겠다.
  2. 실력에 상관 없이 모두가 즐길 수 있었으면 좋겠다.
  3. 자기 티어에 맞는 문제를 푸는 것에 가산점이 있으면 좋겠다.
  4. 다양한 문제를 많이 풀면 좋겠다.
  5. 랜덤성이 존재하면 좋겠다.
  6. 언레에 기여가 많이 되었으면 좋겠다.

 

1번을 위해서 단순히 문제를 푸는 것으로 결정되는 것이 아니라 문제를 풀고 난 이후 스티커 조합을 실험해보며 숨겨진 조건을 찾을 수 있게끔 했습니다. 조건에 맞는 문제를 찾아서 푸는 즐거움도 있을거라고 생각했고요. 이게 재밌었을지는 조금 의견이 분분한 것 같아 슬프지만 평소에 퍼즐을 좋아하시던 분들은 즐겨주신 거 같아 다행입니다.

 

2번과 3번의 목적에서 도입된 것이 '레벨 범위 문제'입니다. 이벤트에서 레벨 범위 문제를 도입한 것은 옳은 결정이었다고 생각하지만, 이 역시 약간의 문제가 있었습니다.

 

우선은 부계를 막을 방법이 없었습니다. 계정 생성일로 1차적으로 막긴 했지만 그 이전에 만들어놓은 계정은 막는 것이 불가능했고, 부계가 아니더라도 실력과 티어가 항상 비례하는 것은 아니기에 형평성의 문제도 있던 것 같습니다. 이를 막을 방법은 계속 고민하고 있지만 솔브드에서 실력의 지표로 사용할 수 있는 수치가 티어인 만큼 이 외에 더 적합한 방법이 존재하지는 않는 것 같습니다. 이후 이벤트를 연다면 이 부분을 조금 더 고려해 볼 생각입니다.

 

레벨 범위 문제가 루비~마스터 티어의 유저들에게 가혹했다는 지적도 있습니다. 이는 저와 shiftpsh 님의 기준에서 레벨 범위 문제를 선정해서 발생한 문제 같은데, 상위권 티어로 갈수록 티어 하나하나의 벽이 크다는 것을 간과했습니다. 다음에는 레벨 범위 문제의 상한을 플레티넘 1 ~ 다이아 5 정도로 설정할 것 같습니다.

 

4번을 위해서는 태그 보너스를 만들었습니다. 5번은 스티커 점수와 모양에 랜덤을 두었고 6번은 언레 문제의 점수를 통상적인 문제보다 높게 설정했습니다.

 

이 외에는 점수 분포가 솔브드 티어와 비슷했으면 좋겠다고 생각했기에 3500을 최대 배율로 나누고, 이걸 다시 한 번 적당히 5로 나눈 값을 각 스티커 별 점수로 설정했습니다.

 

개발

기획이 다 나왔으므로 이제 개발을 할 차례입니다. 개발 얘기는 사실 코드가 비공개인만큼 자세히 쓸 게 없는데, 처음으로 백엔드와 프론트 양쪽 다 작업했습니다. solved.ac 크레딧에 보면 개발-프론트엔드에서 개발-프론트엔드, 백엔드로 바뀐 것을 볼 수 있습니다. 뿌듯해요.

 

개발 - 프론트엔드, 백엔드

 

개발은 6월 24일에 시작해서 6월 26일에 끝났습니다. 사실 이렇게 일찍 끝날 줄 모르고 맨 처음 이벤트 시작일을 8월 1일로 잡았었는데, 굉장히 의욕이 넘쳤던 탓에 사흘만에 전부 만들었습니다. 아직도 브랜치명은 event-220801이라는 점이 아이러니한거 같습니다.

 

일찍 만들었고 일찍 올리고 싶었으므로 원래 예상보다 한 달이나 빠르게 이벤트를 시작하게 되었습니다. 이벤트 기간은 넉넉하게 한 달로 잡았는데, 조건을 찾는 것이 꽤나 어려울 것이라고 생각했기 때문입니다. 실제로 이벤트 기간이 거의 끝나갈 때 쯤 새로운 조건이 밝혀지기도 했기 때문에 맞는 선택이었던 것 같습니다. 또한 이벤트 기간이 짧을 경우 여러 사정으로 해당 기간에 참여하지 못하는 일이 생길 수 있기 때문에 그 경우를 고려하였습니다.

 

다만 급하게 이벤트를 시작했던 만큼 초반에 스티커 점수 판정 코드에 오류가 있어 한 번 롤백을 진행하였습니다. 다음부터는 코드를 조금 더 꼼꼼하게 짜겠습니다. 죄송합니다...

 

이벤트 시작

그렇게 이벤트가 시작되었습니다. 초반에는 문제를 많이 풀면 스코어보드에 올라갈 수 있었습니다. 하지만 장기 이벤트인 만큼 초반 스퍼트보다는 조건이 공개된 후반이 더 중요했던 것 같습니다.

 

3500점은 불가능하지 않을까?

이벤트를 올려놓고 나서 shiftpsh 님과 3500점을 달성하는 사람이 있을지에 관해 논의했습니다. 3500점을 적당히 나눈 값을 스티커 점수로 설정하기는 했는데, 생각해보니 모든 조건을 다 달성한다는 것이 불가능하지 않을까? 라는 생각이었습니다. 그 결과 별조각 컷을 3500점에서 3250점으로 내리게 되었습니다. 근데 실제로 전부 달성한 분이 나와서... 그냥 그대로 둘걸 그랬다 싶기도 합니다. 아니 어떻게 그 조건을 다 맞추지?

 

언레 사냥

초반에는 본인 티어 문제를 많이 풀던 이벤트가 어느 순간 언레 사냥으로 양상이 바뀌기 시작했습니다. 언레의 기본 점수가 높은데다가 언레일 때 받을 수 있는 보너스(태그 없음 보너스, 푼 사람수 10명 이하 보너스)가 강력했기 때문입니다. 사실 솔브드의 입장에서는 더 많은 문제에 난이도 기여가 달리므로 좋은 현상이었습니다. 다만 언레를 많이 풀어야 한다는 게 부담이기도 했던 것 같습니다.

 

이벤트 기획 당시 언레가 많이 풀리기를 기대하기는 했습니다. 정확히 말하자면, 상위권 유저들에게 레벨 범위 문제가 부담일 수 있기에 언레를 푼다는 또 다른 길을 열어주고 싶었습니다. 그렇게 해서 탄생한 것이 언레의 높은 기본 점수와 강력한 보너스였습니다. 모두가 언레를 풀 거라고는 생각하지 못했는데, 왜냐면 언레를 푸는 것 보다 레벨 범위 문제에서 태그 보너스를 맞추는 것이 더 배율이 크게끔 설정했기 때문입니다. 1등 분을 포함하여 태그 보너스를 눈치채신 분들이 꽤 있는 것 같았는데 끝까지 공개적으로 알려지지는 않아 아쉬웠습니다.

 

또 아쉬운 건, 다이아~루비 티어의 문제에서 조건을 완전히 충족하는 문제 셋이 존재하지 않는다는 제보를 받았습니다. 이벤트를 기획할 때는 문제가 이렇게 많으니 어느 티어든 조건을 충족할 수 있을 것이라고 생각했는데 초기 기획에는 없던 digit 보너스를 추가하면서 (이벤트 시작 직전에 추가된 보너스입니다) 상위권에서는 보너스를 전부 받을 수 있는 문제 셋이 없는 경우가 발생했던 것 같습니다. 이 역시 다음 이벤트에서는 고려할 예정입니다.

 

치열한 경쟁

예상했던 것보다 엽서 이벤트의 경쟁이 꽤 치열했습니다. 기획하는 입장에서는 많은 분들이 열정적으로 참여해주셔서 좋았지만, 이벤트를 달리시던 분들은 지친다는 얘기가 있었던 걸로 보아 양날의 검이었던 것 같습니다. 사실 digit 보너스가 밝혀지고 이벤트에 대해 부정적인 얘기가 나올 때 이벤트를 괜히 열었나 같은 생각도 했던 것 같습니다.

 

조금 변명을 해보자면, digit 보너스의 경우 이벤트 시작 직전에 최고 배율을 얻는 것이 너무 어려울 것이라는 생각이 들어 급하게 추가한 보너스의 보너스 같은 느낌이었습니다. 그러나 이벤트 상위권 분들이 굉장히 열심히 달려준 덕에 digit 보너스까지 받아야 10등 안에 들 수 있었고, 그래서 많은 분들이 피로함을 느끼신 것 같습니다.

 

그 외에는 스크립트를 짜서 특정 문제나 조합을 찾는다고 말씀해주신 분들 등 열정적으로 참여해주신 분들이 많아 뿌듯했습니다. 다음에는 좀 덜 지치고 더 재밌는 이벤트로 찾아 뵐 수 있으면 좋겠습니다.

 

이벤트 조건

그래서 이벤트 조건이 뭐였나요? 정확한 이벤트 조건은 아래와 같습니다.

 

  • 티어 보너스
    • 전부 같은 티어 색 +0.1배
    • 전부 다른 티어 색 +0.1배
    • 전부 같은 티어 숫자 +0.1배
    • 전부 다른 티어 숫자 +0.1배
  • 태그 보너스
    • 태그가 없으면 +0.2배
    • 전부 같은 태그 +0.1배
    • 모든 문제의 태그가 겹치지 않을 경우 +0.1배
    • 태그 합 10개 이상 +0.1배
    • 태그 합 15개 이상 +0.2배
    • 태그 합 20개 이상 +0.2배
  • 모양 보너스
    • 전부 같은 모양 +0.1배
    • 전부 다른 모양 +0.1배
  • 문제 번호 보너스
    • 전부 홀수 +0.1배
    • 전부 짝수 +0.1배
    • 문제 번호에 사용된 digit이 4개 이하 +0.1배
    • 문제 번호에 사용된 digit이 3개 이하 +0.1배
    • 한 문제라도 문제 번호와 푼 사람 수가 같으면 +0.2배
  • 푼 사람 수
    • 한 문제라도 푼 사람 수가 10 이하면 +0.1배

 

마치며

개인적으로는 아쉬움도 남지만, 그만큼 뿌듯한 이벤트였습니다. 기획부터 개발까지 거의 모든 것을 스스로 했기 때문에 더욱 기억에 남습니다.

 

이번 이벤트에서 배운 점을 발판으로 삼아 다음에는 더욱 재밌는 이벤트를 열 수 있으면 좋겠습니다.

 

다들 수고하셨습니다!