1. 부대 근무 환경
군생활을 기동대대에서 했다.
사단 직할 기동이라 불침번을 제외하고서는 근무가 없어야하는데,,
출동 시간을 줄이기 위해, 사단본부가 아닌 연대 본부에 위치해 있었던 관계로
이런저런 근무를 짬맞기 일쑤였다.
순찰 근무, 탄약고 경비 근무, 1년에 한번 예비군 훈련까지..
부대의 환경이 자주 바뀌다보니 근무 형태도 자주 변경되었다.
더군다나 일일이 중대 행보관이 수기로 근무표를 작성하다 보니
누구는 근무를 많이 서는 일이 생기거나, 연달아 계속 들어가는 일도 생기기도 했다.
2. 중대 행정 업무 프로그램 제작기
많은 행정 작업이 한셀로 이루어지고 있었는데, 엑셀 VBA 코드를 사용할 수 있다.
그 때 당시 간단한 문서작업들을 자동화하면서 이곳저곳에 도움을 주고 다녔다.
그래서 VBA로 자동으로 다음 근무 순번을 뽑아주는 프로그램을 만들고자 했다!
(만들다보니 중대 행정 기능이 계속 추가되었다.)
시간이 너무 오래지나서 기억이 가물가물한데 구현했던 기능을 이렇다.
- 연가 계산 기능 (군생활이 점차 줄어들고 있던 시기라, 병사마다 연가가 달랐다.)
- 개인 휴가 종합 기능 (받은 휴가, 사용한 휴가를 입력하면, 어떤 휴가가 몇일 남았는지 계산 가능)
- 중대 출타율 계산 기능 (출타율은 일 단위로 계산됨. 중대에게 할당된 출타율 내에서 병사 휴가 가능)
- 진급 날짜 계산 기능 (진급식을 할 때마다 일일이 간부들이 대상자를 조사하러 다니는 수고를 덜 수 있다.)
- 체력측정 기록 관리 기능 (체력을 중요하게 생각하는 부대였다. 매 분기 체력측정을 엄격하게 해서 각 종목별 점수를 계산했었다. 이전 달 대비 개인별 변화와 소대별 변화, 중대 전체의 점수 변화를 볼 수 있도록 했었다.)
- 공정 근무 투입 기능 (이게 제일 어려웠다.)
이렇게 쓰고 보니 꽤나 많이 했었네.. 허허
일과시간에는 정상적으로 훈련받고, 저녁에는 체단실 가서 운동하고, 야간 연등시간에 2시간씩 작업하고 잤던 거 같다.
3. 공정 근무 프로그램
(1) 요구사항
공정 근무 프로그램의 요구사항은 이렇다.
- 불침번, cctv 근무, 초소순찰(사수, 부사수) 세 가지 형태의 근무가 존재
- 연달아서 들어가는 일 없이 최대한 규칙적으로 배정
(퐁당퐁당~) - (개인별 군 복무일 수) 대비 (근무투입회수)가 일정해야함.
- 근무시간대를 최대한 골고루 배정해야함.
- 지난 날짜의 근무 기록 확인이 가능해야함.
굵직하게 기억나는 건 이 정도
1번의 경우는 부대 상황과 병사 개인의 사정을 고려하고 배정하는 것이어서, 병사별로 근무 mode를 지정할 수 있도록 했다. 그러면 mode 맞게끔 자동으로 해당 근무표를 뽑아준다. 5번 근무 기록은 한 워크시트당 1년치씩 자동 생성 및 기록되도록 했다. 새해가 되면 해당 년도 워크시트를 자동으로 만든다.
3번과 4번이 가장 중요한 요소였다. 3번을 해결하면 2번도 어느정도 자동으로 해결되기도 했다. 둘 다 한가지 알고리즘으로 해결이 가능했다. 그 당시에 엄청 고민을 많이 했던 기억이 난다. 알고리즘 짠 것을 하나하나 시험해보면서 근무표를 뽑아봤었다.
(2) '공정함'을 구현
결론적으로는 가중치를 부여하는 방식을 사용하면 된다. 3번의 경우에는 총 군복무일 수가 가중치이고, 4번에 경우에는 근무 시간대 별로 투입 횟수가 가중치가 된다.
$$ratio = \frac{총 \ 근무 \ 횟수} {총 \ 복무일 \ 수}$$
비율이 가장 적은 사람이 바로 다음 순번이 된다.
그런데 문제가 있다. 동일한 비율인 사람이 있을 때는 누구를 골라야할까?
병장을 골라야할까? 아니면 이등병을 골라야할까?
다음날의 근무가 1회 더 늘었을 때의 ratio 변화량을 생각해보자
$$\Delta ratio = \frac{1} {총 \ 복무일 \ 수}$$
총 복무일 수가 낮은 이등병을 투입시켰을 때, ratio가 병장에 비해 큰 폭으로 증가한다.
이렇게 되면, ratio 가 전체적으로 낮지 않은편인데도, 이 이등병과 비교되는 특정한 상황(실제 해당 부대 근무와 관련된 특수한 상황이다.)에 다른 누군가가 순간적으로 더 많이 들어가게 되는 현상이 벌어진다. 연쇄적으로 다른 병사에게 이 영향이 전파된다. 결과적으로, 병사별로 ratio 값을 쭉 나열하고 보면 들쭉날쭉하게 불안정한 분포를 보이게 된다. 따라서 변화량이 가장 적은 사람을 선택해야한다. 처음에 소개했던 \(ratio\)를 폐기하고, 수정된 버전을 사용해야한다.
$$virtual \ work \ ratio = \frac{(총 \ 근무 \ 횟수) + 1} {총\ 복무일 \ 수}$$
4. 이 글을 쓰게 된 진짜 이유
사실 최근에 OS 수업 듣다가 이 경험이 생각났다. 멀티 코어 프로세스 스케줄링 에서 WFQ(Weighted Fair Queue) 가 바로 이것과 완전히 동일한 알고리즘이었다. 수업 듣다가.. 추억이 새록새록... ㅎㅎ
'이러쿵저러쿵' 카테고리의 다른 글
정보보안 랩실 학부연구생 기록 (6개월) (0) | 2023.01.29 |
---|---|
[대학원] 포스텍 컴퓨터공학과 합격 후기 (자소서 첨부) (6) | 2023.01.29 |
무엇을 위한 개발인가.. (0) | 2022.05.09 |
[삼성전자 X 관악구] 멘토링 후기 (0) | 2021.04.04 |
이식성(Portability), 표준의 중요성! (0) | 2021.03.02 |