개발 이모저모/프로젝트

[게임 이벤트 풀이] 중복 2개가 가능한 3자리 숫자야구 풀이

lovelyunsh 2023. 1. 5. 21:04

서론

2019년도에 하던 게임인 소울워커

 

이벤트 중 숫자 야구라는 게임으로

적은 회차만에 맞출수록 더 많은 상품을 주는 이벤트를 한 적이 있다.

 

처음에는 직접 푸는 재미가 있어 직접 풀었지만, 그것도 처음에나 재밌지

매일 반복되니 스트레스로 다가왔다.

 

또 게임 커뮤니티에 숫자 야구 자체가 처음이라 문제를 못푸는 사람들이 많았기에

그러한 사람들을 위해 이벤트를 풀이해줄 프로그램을 만들어 보기로 했다.

 

게임 규칙

우선 간단한 게임 규칙을  소개하면

숨겨진 3자리 숫자를 찾으면 이기는 게임인데

내가 3자리 숫자를 입력하면 S와 B로 힌트를 준다.

 

S는 숫자와 자리를 모두 맞췄을 경우

B는 자리는 다르고 숫자는 맞췄을 경우

그리고 OUT은 어떤 숫자도 맞추지 못했을 경우 알려준다.

 

예를 들어

715 라는 숫자가 답이면

123 - 1B

751 - 1S 2B

234 - OUT

 

위 와 같이 힌트를 준다.

여기서 3S 가 나오면 이긴다.

 

일반적으론 1~9로 이루어지고 각 자리가 중복이 되지 않는 3자리 숫자를

문제를 내는 것이 일반적인데,

 

내가 풀어야할 이벤트의 경우

1~9로 이루어지고, 3자리 숫자인 것은 같지만

중복 숫자 2개 까지는 가능하다는 차이점이 있다.

 

풀이 방법

검색을 해보니 숫자 야구 풀이 자체를 문제로 하는 프로그래머스 문제가 있었다.

 

해당 문제의 풀이를 찾아 봤는데, 대부분이 전체 경우의 수를 구하고 조건에 해당하지 않는 경우를 제거하는 소거법을 이용하여 풀이를 하고 있었다.

 

풀이를 알았으니 그럼 바로 개발 시작!

개발 시작!

사실 개발은 그렇게 어렵지 않았다.

 

1. 숫자 2개의 중복을 허용하는 3자리 수의 순열 구하기

2. 현재 남은 경우의 수 중 가능한 랜덤한 하나의 수를 추천하기.

3. 이벤트에 입력한 숫자를 입력 받고

4. 결과로 나왔을 strike와 ball을 입력 받기

5. strike와 ball 조건에 맞지 않는 모든 수를 경우의 수에서 제외

6. 경우의 수가 1개가 남을 때까지 3~5 반복

7. 1개가 남으면 answer를 출력하고 종료

 

이렇게 개발하여 만들어진 야구게임 풀이 초기 버전

도스창에서 텍스트로 작동한다.

 

커뮤니티에 공유하기 위해 exe 파일로 만들려고 잘 모르는 C++로 개발했다.

 

그런데 exe로 만든 프로그램을 웹으로 올리려고 하니 문제가 발생했다.

실행 프로그램은 인증서가 없으면 제대로 된 대우?를 못받는다는 것.. 심지어 인증서는 유료..

매번 신뢰할 수 없는 프로그램이라면서 파일 공유에 차질이 생기게 되었다.

 

어떻게 해야하나 고민을 하고 있었는데, 일반적인 숫자 야구 ( 중복이 없는 3자리 숫자) 풀이 사이트를

공유하는 github repo를 찾게 되었다.

 

오, 이 코드를 조그만 수정해서 web으로 올리면 되겠다!

바로 fork를 떠와서 코드를 읽어봤다.

웹 버전으로 개발

그런데 코드를 읽다 보니 내가 만든 것과 알고리즘에 차이점이 있었다. 바로

 

2. 현재 남은 경우의 수 중 가능한 랜덤한 하나의 수를 추천하기.

 

나는 현재 가능한 수 중 아무거나 하나를 추천 해주었는데,

이 코드는 가장 경우의 수를 많이 줄일 수 있는 수를 추천 하는 알고리즘이 추가 적용 되어 있었다.

 

오히려 좋아!

 

그 외에 소거법을 이용한다는 것은 별 차이가 없었기에

처음 경우의 수를 구하는 코드만 일부 수정하였고

github 페이지로 올릴 수 있었다.

https://lovelyunsh.github.io/Bulls-and-Cows-Solver/

 

 

마치며

현재는 아무도 사용하고 있지 않지만

당시 이벤트 마지막 하루 정도만 hits를 세어 보았을 때 8000번 가량 방문이 이뤄졌었다.

이벤트 중 일주일 정도의 기간 동안 공유를 했었으니 못해도 실이용자 만명정도는 있지 않았을까?

 

어쨋든 어찌보면 나의 첫 웹 서비스였고 사용자로부터 감사하다는 말을 듣고 뿌듯했던 감정 등을 간직하고자 게시글로 남겨본다.