2026년 7월 20일 월요일

Sudoku 계산기를 만들어 보았다.

 요즘 심심할 때 가끔 하는 것이 Sudoku 다.

주로 sudoku.com 에 들어가서 하곤 했는데, PC에서는 별도로 로그인이나 광고가 없어 특히 이용했던 것 같다.

잘 풀려서 흥이 나면 정신없이 하는 경우가 많아, 토너먼트 항목에서 3위에 들었을 때도 있었다.

오기가 생겨 몇 번을 1위에 도전했지만 세상은 넓고 스도쿠엔 나보다 진심인 사람들이 많은 것 같다.


나의 초등학생 적인 사고와 개발자 기질이 만나 나쁜 생각을 하게 되었다.

Sudoku를 자동 계산해서 해결해 주는 소프트웨어로 1등을 노려보자!


쉽게 생각하고 달려들었지만 생각보다 해결해야 할 것은 많았다.

우선 일의 순서를 정했다.


1. Sudoku 를 계산하는 기능 개발

2. 계산한 결과를 사이트에 입력하는 기능 개발

3. 사이트에 있는 내용을 내 App에 입력하는 기능 개발


먼저 Sudoku를 게산하는 기능 개발을 시작했다.

먼저 Sudoku 해법을 찾아내기 위해 숫자를 입력하면 나머지 칸들에 작은 글자로 입력 가능한 숫자들이 나타나도록 만들어 보았다.


입력 가능한 숫자를 표시하기 위하여 아래와 같이 만들어 보았다.

1. 행, 열, 박스에 대한 초기 값을 모든 숫자 가능으로 하여 생성한다.

2. 숫자를 입력 할 때 해당하는 행과 열, 박스에 입력된 값을 제거한다.

3. 최종적으로 각 셀에 대해 해당하는 행, 열, 박스의 남은 입력 허용값을 AND 연산 하여 계산한다.

4. 값이 입력된 칸의 입력 가능한 값은 존재하지 않는다. (이미 입력되었으므로)

전보다 계산하고 검증하기는 좋아졌다.

이제 칸을 채우는 방법을 고민할 차례였다.


칸 채우는 조건을 아래와 같이 정했다.

1. 해당 빈 칸의 입력 가능한 숫자 중 현재 행에서 유일한 숫자인 값이 있으면 정답

2. 해당 빈 칸의 입력 가능한 숫자 중 현재 열에서 유일한 숫자인 값이 있으면 정답

3. 해당 빈 칸의 입력 가능한 숫자 중 현재 박스 (3x3)에서 유일한 값이 있으면 정답


이 조건으로 계산을 해보니 난이도 보통까지는 별 문제 없이 풀렸다.

하지만 극한에 가서는 빈 칸을 1 ~3개정도 만 채우고 멈췄다.

결국 남은 칸 들은 허용 가능한 값들 내에서 하나 씩 연산 해 보고 잘못되면 다시 롤백하는 식으로 계산해야 한다는 결론이 나왔다.

 빠른 연산을 위해 채워야 할 빈칸의 히스토리 배열을 만들고 입력 가능한 값이 제일 적은 칸 순서로 정렬해 가며 계산하도록 만들었다.


몇 번의 디비겅 삽질 끝에 계산 기능을 완성했다.

아직 귀칞아 계산할 수 없는 잘못 된 입력값이 있을 때에 알려주는 기능을 넣지는 않았지만 계산 버튼 (Calc)를 눌러도 반응이 없는 것으로 입력 값이 잘못 되었다는 것을 알 수 있다.

나중에 시간 나면 잘못된 계산 값을 알리는 기능도 추가해 봐야겠다.


이제 계산한 결과를 사이트에 적용 하는 기능을 개발할 차례다.

이 부분은 고민을 하다 생각 보다 쉽게 해결 되었는데, 바로 원격 매크로 등에 자주 사용되는

SendInput 이라는 WIN32 API 를 활용하였다.

먼재 내 APP과 sudoku 사이트를 나란히 띄워두고 POS 컨트롤을 클릭하여 focus를 활성화 시킨 다음 마우스 커서를
sudoku 사이트의 입력 칸의 좌측 상단에 놓고 "S"키를 누르고 우측 하단에 놓은 다음 "E"키를 눌러 화면상 sudoku
입력 위치를 App이 알 수 있도록 해 주었다.


좌표가 pos 밑에 표시되면 성공한 것이다.

App에 값을 입력한 후 CALC를 눌러 계산하고 결과가 계산되면 UPDATE를 누르면 자동으로

오른쪽에 웹브라우저를 통해 입력되게 되었다.


성공이다!

아쉽고도 현재는 입력을 칸을 클릭하여 수동으로 일일이 해줘야 하지만 자동 입력을 하려니 OpenCV 등 여러가지를 사용해야 하여, 내 관심 분야 바깥이다 보니 지금으로선 이정도로 만족하려 한다.


이제 이것을 이용하여 본격적으로 점수를 올려보려 하였지만, 쉽게 얻는 것은 쉽게 흥미를 잃는 것

처럼 sudoku도 쉽게 계산되니 재미가 없어 이것을 이용해서 1등을 해보려는 생각은 없어지게 되었다.

시험 삼아 만든 App이니 참고하시라고 업로드는 해 두겠다.


참고로 이 App은 내가 만든 임베디드 기반 UI 플랫폼을 기준으로 만들어 져 있어서 윈도우에서의 동작이 어색한 부분이 많다. 

폰트나 컨트롤들도 윈도우 것이 아니다 보니 많이 고전적(?)으로 보일 듯하다. 

뭐.. 나의 부족한 디자인 감각도 한 몫을 한 듯하다.


다시 시간이 나면 2D 게임 엔진 개발을 마무리 하고 간단한 2D 액션 게임이라도 만들어 볼 생각이다.

그럼 다음에는 좀 더 뭔가 쓸만한 이야기를 올려보도록 노력해 보겠다.


프로그램 다운받기: 다운로드 링크

 


댓글 없음:

댓글 쓰기