
저는 군대에 있을 때 개인정비 시간에 알고리즘 문제들을 풀며 코딩 공부를 시작했습니다. 처음에는 파이썬 문법도 잘 몰라서 공부하고 찾아가며 공부하였습니다. 상병 쯤 되니 이제 구현이나 그래프탐색 문제는 감이 잡혔습니다. 그런데 이때 저희 부대 행정병이 마음에 편지에 적혀 타부대로 가게 된다는 소식을 듣게 되었습니다. 행정병과 다른 부대원들의 근본적인 갈등의 원인은 불침번 근무 순번 때문이었습니다.
저는 근무표 짜는 게 그렇게 어려울까? 왜 근무표를 짜는 것을 어려워하지? 라고 생각하였습니다. 알고리즘 공부를 하고 있었던 저는 이를 코딩으로 해결하고 싶었습니다. 하지만 문제가 있었습니다. 저는 파이썬밖에 할 줄 몰랐지만 군대에는 파이썬이 깔려있지 않았던 겁니다. 간부님들께 말씀도 드려봤지만 관심도 갖지 않으셨습니다.
그래서 저는 군대만 사용한다는 한셀로 프로그램을 만들기 시작했습니다. 한셀에서 다행히 VBS Script라는 프로그래밍 언어를 지원하였고, 이를 공부하여 구현해보고자 하였습니다.
하지만, 코딩을 하면 할수록 왜 행정병이 힘들어했는지 이해할 수 있었습니다. 우선, 병사마다 가중치를 계산하여 근무 날짜를 구하는 것부터 어려움이 있었습니다. 신병이 들어왔을 때 생기는 문제도 있었고 중간에 휴가를 가는 인원도 있었습니다. 따라서, 가중치를 계산하기 위해서 비교하려는 데이터는 언제를 기준으로 하느냐 등 고려해야 하는 사항이 많았습니다. 하지만 동시에 든 생각은, '사람이 근무표를 짜면 절대로 공정한 근무표가 나올 수 없다.' 였습니다.
우선 하루에 6명의 근무자를 선정하는 방식은, 한달 동안의 근무자 데이터를 바탕으로 이전에 섰던 근무들의 날짜를 오늘 날짜와 비교하여 그 차이를 바탕으로 가중치를 계산하였습니다. 그런데 이보다 더 중요한 문제는 근무 순번이었습니다.
병사들이 불만을 갖고 있던 것은 근무 날짜보다도 순번이었습니다. 1번초부터 6번초까지 모두 골고루 서야 한다는 문제가 있었습니다.
어떤 병사들은 2, 3, 5번초 중 하나를 서야 하는 상황이었고 다른 병사는 1, 2, 4번초, 다른 병사는 2, 3, 4번초 중 하나를 서야 하는 상황에서 모든 조건을 맞출 수 없는 경우가 발생하였습니다.
개인 정비 시간마다 백준 문제를 풀며 알고리즘을 공부하고 있었던 저는 때마침 이분매칭 알고리즘을 접하게 되었습니다. 지금까지 근무 순번을 그리디하게 해결하려고 했었는데 해결 방법을 찾은 것이었습니다. 한셀 프로그램의 VBS Script로 dfs함수를 구현하였고 이분매칭 알고리즘을 이용하여 순번 문제를 해결할 수 있었습니다.
이후 또 다른 문제가 있었습니다. 결국은 간부님들과 상급 부대에 승인이 필요하다는 것이었습니다. 한셀 파일을 검토받기 위해서 병사들의 데이터를 저장하는 시트와 근무표가 보여지는 시트를 구분한 뒤, 데이터에 접근하지 못하도록 하였습니다. 간부님들이 별 다른 설명서 없이 프로그램을 사용할 수 있도록 사용자경험을 증대시킬 수 있는 기능들을 많이 추가하였습니다. 모달창을 활용하여 프로그램이 버그가 날 상황을 막았고, 다양한 버튼을 만들어 함수 실행을 편리하게 하였습니다. 또한, 날짜를 드래그하여 출력 버튼을 누르면 해당 기간 만큼의 근무표가 출력되도록 하는 추가 기능을 만들었습니다.
우연히 사단장님이 저희 부대를 방문하신다는 이야기가 들려왔습니다. 이 기회를 놓칠 수 없다는 생각에 간부님을 설득하여 기회를 얻어냈습니다. 이후 사단장님께 제가 만든 프로그램을 시현할 수 있었고, 성공적으로 승인을 받아냈습니다. 그 뿐만 아니라 다른 부대들도 제 프로그램을 사용하게 되었습니다.
이를 계기로 저는 예상치 못한 표창과 포상 휴가 5일을 받게 되었습니다. 비전공자였던 저는 코딩의 재미를 알아버렸고, 전역 후에도 계속 개발 공부를 하고 있습니다 :)