논리/엑셀 프로그래밍

근무 명령 알고리즘 (사수/부사수)

섬그늘 2008. 11. 14. 11:22

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=1050202&eid=aJuwCsNmmeMPTsF+k0OXS34mF+E6B4dt

 

아래 예시에서는 사수 10명, 부사수 7명, 타임 6회일 경우를 보였습니다만, n명 m명 t회일 경우라도 로직은 같습니다. 아래 표를 마우스로 긁어 복사(CTRL+C), 엑셀시트에 붙여 해당 주소로 가도록 옮기시고 수식 역시 마우스로 긁어 복사, 해당 주소창에 붙여넣으신 후 보시면 편합니다.

 

 

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

2

10

 

7

 

타임

6

 

 

 

 

 

 

 

3

 

 

 

 

 

1

일차

 

 

 

2

일차

 

 

 

4

 

 

 

타임

A

 

B

 

타임

A

 

B

 

5

7

2

 

0

 

 

 

 

0

2

4

1

5

6

9

5

 

1

1

1

2

2

1

4

6

3

7

7

10

1

 

2

3

3

4

4

2

6

1

5

2

8

2

7

 

3

5

5

6

6

3

8

3

7

4

9

3

3

 

4

7

7

8

1

4

10

5

9

6

10

8

6

 

5

9

2

10

3

5

1

7

2

1

11

1

4

 

6

2

4

1

5

6

3

2

4

3

12

5

 

 

 

 

 

 

 

 

 

 

 

 

 

13

6

 

 

 

1

일차

 

 

 

2

일차

 

 

 

14

4

 

 

 

타임

A

 

B

 

타임

A

 

B

 

15

 

 

 

 

 

1

1

16

 

 

 

 

 

2

2

17

 

 

 

 

 

3

3

18

 

 

 

 

 

4

4

19

 

 

 

 

 

5

5

20

 

 

 

 

 

6

6

 

기본테이블 (G3:P11) ; 해당 열 데이타를 하염 없이 반복시키기

H6:K6에 각각 1, 1, 2, 2 입력 (초기 값)

H7 =IF(H6+2>$C$2,MOD(H6,2)+1,H6+2) ; 위 숫자에 2를 더하되 초과하면 홀짝 교체

I7 =IF(I6+2>$F$2,MOD(I6,2)+1,I6+2) ; 마찬가지. 직전 A초소 근무였다면 지금부터는 B초소 근무가 됨.

; H7:I7 잡아 J7:K7에 복사, H7:K7 잡아 아래로 H11:K11까지 복사

M5 =H11 ; 전날 마지막 근무 데이타를 불러 옴

; M5 잡아 오른쪽으로 P5까지 복사, H7:K7 잡아 M6:P11에 복사하면 기본테이블 완성됨.

 

난수표로 데이타 섞기 (B4:E14) ; C, E열에 사수, 부사수 명단을 나열한 후,

B5 =SMALL(IF(COUNTIF(B4:B$4,ROW($1:$10))=0,ROW($1:$10),11),INT(RAND()*(C$2-COUNTA(B4:B$4)))+1)

D5 =SMALL(IF(COUNTIF(D4:D$4,ROW($1:$7))=0,ROW($1:$7),8),INT(RAND()*(F$2-COUNTA(D4:D$4)))+1)

; B5, D5 모두 수식 입력 후 CTRL+SHIFT+ENTER 해야 함 (배열 수식), B5 잡아 아래로 B14까지, D5 잡아 아래로 D11까지 복사. (B4, D4는 빈칸이어야 함)

 

결과테이블 (G13:P20) ; 기본테이블 수치에 VLOOKUP을 걸어 난수표로 섞인 이름을 가져 옴.

H15 =VLOOKUP(H6,$B$5:$C$14,2,0)

I15 =VLOOKUP(I6,$D$5:$E$11,2,0)

; H15:I15 잡아 J15:K15에 복사, H15:K15 잡아 아래로, 그리고 M15:P20에 복사하면 표가 완성됩니다.

 

이후는 L3:P20 잡아 오른쪽으로 원하는 만큼 복사해 붙여 넣으면 N일차의 근무명령이 나오겠지요. 다만 사수와 부사수의 수가 서로소가 아닐 경우 모두 만날 기회가 없어지는 단점이 있습니다. 그 경우라면 적절한 날에 H6:K6의 초기값을 바꿔주는 것이 좋을 겁니다. 그리고 난수를 사용했기 때문에 한번 작업 후에는 결과표를 복사-선택하여 붙여넣기-값-확인하여 적절한 곳에 붙여 두시는 것이 좋습니다.