# 소개
비전캠프 기숙사 자동 배정 프로그램(V-DAS)입니다.<br/>
<br/>
<br/>
# 정의
```
1. 캠프
여름방학과 겨울방학 기간에 교회나 기독교 단체에서 운영하는 신앙 교육 중심의 캠프를 의미합니다.
캠프는 1회당 9개의 회차로 구성되어있으며, 연평균 2회 주최됩니다.
2. 신청내역
해당 회차에 참가신청을 한 교회들의 성별 별 신청 인원 엑셀 파일입니다.
3. 산출물
3.1) 배정 파일
기숙사 호수 별 배정된 교회들의 이름과 배정 인원이 저장된 엑셀 파일입니다.
3.2) 배정 카드
특정 교회가 기숙사 어느 방에 몇 명이 배정되었는지 배정 현황을 확인할 수 있는 이미지입니다.
3.3) 배정 현황표(라벨지) 이미지
교회 배정 현황 14개 묶음을 표로 나타낸 이미지입니다.
```
<br/>
<br/>
# 성과
### 스태프
> 기숙사 배정 프로세스 자동화
```
기존 비전캠프의 기숙사 팀 스태프는 캠프의 매 회차 당일 새벽 아래와 같은 프로세스로 작업을 진행하였습니다.
```
```
새벽 1시 : 접수팀이 기숙사팀에게 '신청내역'을 전달합니다.
새벽 1시 ~ 새벽 3시 : 기숙사팀은 '신청내역'을 확인하고 '배정 파일'을 작성합니다.
새벽 3시 ~ 새벽 5시 : 기숙사팀 '배정 파일'을 참고하여 '배정 카드'와 '라벨지'를 제작,검수, 출력합니다.
오전 10시 ~ 오전 12시 : 참가 교회들이 도착하고 각 교회에게 배정 카드를 전달하고 라벨지를 잘 보이는 곳에 부착합니다.
```
```
기존 비전캠프 기숙사팀은 1회차 배정당 평균 7시간의 수작업이 필요했습니다.
연 2회 개최되는 캠프는 각각 9회차로 운영되어, 연간 총 126시간(7시간 × 9회차 × 2회)이 숙소 배정 업무에 소요되었습니다.
V-DAS는 기존 수작업으로 이루어지던 기숙사 배정, 배정카드&라벨지 제작, 배정 카드 배부 등 모든 프로세스를 자동화함으로써 숙소 배정 업무 소요시간을 아래와 같이 단축하였습니다.
회차별 소요 시간: 7시간 → 5분 이내 (98.8% 감소)
연간 소요 시간: 126시간 → 1.5시간 (98.8% 감소)
```
## 참여 교회
```
기존 비전캠프 참가 교회는 캠프 시작 당일 기숙사 1층에서 기숙사팀으로부터 배정 카드를 수령해야 했습니다.
배정 카드 수령을 위해서는 교회명 확인 -> 해당 교회의 배정 카드 찾기 -> 배정 카드 배부 과정을 거쳐야 했습니다.
이로 인해 기숙사 1층의 혼잡도가 매우 높아졌고, 참가 교회는 날씨와 긴 대기 시간으로 인한 불편을 겪었습니다.
V-DAS는 교회명 검색만으로 배정 결과를 즉시 확인할 수 있으며, 배정 카드를 직접 다운로드하거나 카카오톡으로 공유할 수 있습니다.
이를 통해 현장을 통한 배정 카드 배부가 필요 없어졌고, 참가 교회의 편의성이 크게 향상되었습니다
회차별 평균 참가 교회 수: 70개 교회
교회당 배정 카드 수령 시간: 1분 → 10초 이내 (83% 감소)
회차별 총 소요 시간: 70분 → 12분 이내 (83% 감소)
연간 총 소요 시간: 1,260분(21시간) → 216분(3.6시간) (83% 감소)
```
<br/>
<br/>
# 유저플로우
## 스태프
```
1. [차수 설정] - 캠프 차수를 선택합니다.
2. [신청내역 업로드] - 신청 내역 엑셀 파일을 업로드합니다.
3. [기숙사 설정] - 각 성별이 사용하는 층, 한 방의 최대 인원, 특정 방 폐쇄 여부를 설정합니다.
4. [자동 배정] - 배정하기 버튼을 클릭해 기숙사 자동 배정을 동작시킵니다.
5. [수동 편집] - 특정 교회의 배정 위치를 변경하거나 참여 인원 수를 수정합니다.
6. [저장] - 저장하기 버튼을 클릭해 DB에 해당 회차의 기숙사 배정 데이터를 저장합니다.
7. [다운로드] - 배정 파일, 배정 카드, 라벨지를 다운로드합니다.
8. [회차 공개] - 캠프 관리 페이지에서 공개할 회차를 설정합니다.(공개된 회차의 기숙사에 배정된 교회만 배정카드를 확인할 수 있습니다.)
```
## 참여 교회
```
1. 교회명을 검색하여 배정카드를 확인합니다.
2. 배정카드 이미지 다운로드, 링크 복사, 카카오톡 공유를 통해 다른 교회 인원과 배정 현황을 공유합니다.
```
<br/>
<br/>
# 요구사항
**1. 기숙사 구성 및 예외조건**
```
기숙사는 여러개의 층으로 구성되어 있다.
한 개의 층은 여러개의 라인으로 구성되어 있다.
한 개의 라인은 여러개의 방으로 구성되어 있다.
하나의 방은 기본적으로 최대 7명의 인원을 수용 가능하다.
```
```
예외) 사용자가 특정 방의 최대 인원을 변경할 수 있다.
예외) 사용자가 특정 방을 폐쇄할 수 있다(최대 인원을 0으로 변경)
```
<br/>
**2. 하나의 교회에 속한 모든 인원은 하나의 기숙사 라인 내에 연속적으로 배정되어야 한다.**
```
예시)
A교회의 남자 인원이 40명이고 특정 라인의 방의 개수가 5개 이하라면, 해당 라인은 최대 수용 가능 인원이 35명이기 때문에 A교회를 수용할 수 없다.
이 경우 A교회는 방이 6개 이상인 라인에 배정하여야한다.
```
<br/>
**3. 교회는 연속적으로 배정되어야 한다.**
```
예시)
A교회의 남자 인원이 25명, B교회의 남자 인원이 17명, 특정 라인(이하 라인1)의 방 개수가 6개라고 가정하자.
라인1에 A교회를 배정하면 A교회는 1,2,3번 방에 각 7명씩, 남은 4명은 4번방에 배정된다.
이 때, 4번방은 아직 최대 수용인원을 채우지 못했으므로 B교회 배정 시 4번방에 3명을 배정한 후 5,6번 방에 7명씩 배정을 한다.
```
```
주의)
조건 간 우선순위는 2번 조건이 3번 조건보다 우선적이다.
위 예시에서 라인1의 방 개수가 5개라면 라인의 최대 수용 인원은 35명이고 라인1에 A교회 배정 후 수용 가능 인원은 10명이기 때문에 B교회 인원 17명을 배정 시 2번 조건을 위배하게 된다.
이 경우, B교회는 라인1에 배정되지 못하며 라인1에는 인원이 10명에 가장 근접한 교회를 배치한다.
* 2번 조건 : 하나의 교회에 속한 모든 인원은 하나의 기숙사 라인 내에 연속적으로 배정되어야 한다
* 3번 조건 : 교회는 연속적으로 배정되어야 한다.
```
**4. 배정 순서는 인원수를 기준으로한다.**
```
인원이 많은 교회부터 배정을 시작한다
```
**5. 배정은 저층을 우선으로 한다.**
```
항상 배정은 저층을 우선으로 한다
예를 들어 A교회가 1층과 2층 모두에 배정될 수 있을 때 1층으로 배정한다.
```
**6. 연속된 배정을 우선으로 한다.**
```
대형교회 A,B가 있다고 가정하자.
A교회를 1번 라인에 배정한 후 B교회 배정 판단을 내려야한다.
이 때, 아래 두가지 선택지 중 어느 것을 선택해야할까?
1. B교회의 배정 선택지는 B교회를 수용할 수 있는 다른 라인에 배치한다.
2. (A교회가 배정된 라인이 아직 B교회의 인원을 수용할 수 있을 경우) A교회와 연속적으로 배치한다. V
```
<br/>
<br/>
# 자동 배정 구현 방법
```
[개념]
* 타겟 교회 : 배정 대상 교회
* 타겟 교회 잔여 인원 : 타겟 교회의 남은 인원(배정해야하는 인원)
* 타겟 교회 꼬리 인원 : 빈 라인에 배정하였을 때 꼬리방에 배정되는 인원
(최대 인원이 7일때 교회인원이 10이라면 타겟 교회 꼬리 인원은 3이다.)
* 핏한 교회 : 교회 인원이 꼬리방을 만들지 않고 모든 방을 꽉 채우는 교회
(최대 인원이 7일때 교회인원이 7, 14, 21...이라면 핏한 교회)
* 짝꿍 교회 : 나와 조합하여 꼬리방이 생기지 않는 라인을 만들 수 있는 교회
(꼬리인원이 3인 교회와 꼬리인원이 4인 교회는 짝꿍 교회)
* 배정 가능 라인 : 타겟 교회를 배정할 수 있는 라인
* 꼬리방 : 라인의 마지막에 배정된 방
(특정 라인에 1,2,3번 방에 배정이 되어있다면 3번방이 꼬리방)
* 꼬리방이 생기지 않는 라인 : 타겟 라인에 이미 다른 교회가 배정되어 꼬리방이 생겼을 때 연속적으로 배정하면 꼬리방을 없앨 수 있는 라인
(꼬리인원이 3명일때 꼬리방 잔여인원이 3명인 라인)
* 꼬리 인원이 n만큼 생기는 라인 : 타겟 라인에 이미 다른 교회가 배정되어 꼬리방이 생겼을 때 연속적으로 배정하면 꼬리방 잔여 인원이 n인 라인
```
```
* 라인 배정 : 라인 배정 시 배정 가능한 라인이 여러개라면 배정 라인 우선순위는
저층 5번 라인 > 고층 5번 라인 > 저층 4>3>2>1 라인 > 고층 4>3>2>1 라인 순입니다.
즉, 모든 층의 5번 라인이 우선되며 그 중에서도 저층 5번라인이 가장 우선순위가 높고 각층의 라인 우선순위는 4>3>2>1 순입니다.
```
```
[교회 1개를 자동 배정하는 프로세스]
1. '타겟 교회 잔여 인원'을 통해 모든 '배정 가능 라인'의 인덱스를 추출합니다.
2. '배정 가능 라인'의 '꼬리방'의 잔여 인원을 검사합니다.
3. 꼬리방이 생기지 않는 라인을 추출합니다.
4. 꼬리방이 생기기 않는 라인이 있다면 해당 라인에 교회를 배정 후 함수를 종료합니다.(END)
5. 배정 가능 라인이 있다면 타겟 교회 배정 후 짝꿍 교회를 같은 라인에 배정 후 함수 종료합니다.(END)
6. 꼬리 인원이 1만큼 생기는 라인을 추출합니다
7. 꼬리 인원이 1만큼 생기는 라인이 있다면 해당 라인에 교회를 배정 후 함수를 종료합니다(END)
8. 꼬리 인원이 2만큼 생기는 라인이 있다면 해당 라인에 교회를 배정 후 함수를 종료합니다(END)
9. 함수를 종료합니다.
[모든 참여 교회를 자동 배정하는 프로세스]
1~9를 모든 교회에 반복합니다.
```