티스토리 뷰

반응형
제목은 거창해 보이나

별로 거창한 내용은 아니다. ㅎㅎ

이름도 대충 내가 붙인거니 신경쓰지 말고..

예를들어 이런거다.

10명의 직원이 일렬로 줄지어 서 있다고

가정했을 때 한명씩 순서대로 빵을 나눠주고

한바퀴 돌아 10명의 직원이 빵을 다 받으면

10명의 직원의 그릇을 비우고

다시 새 빵을 순서대로 나눠 받는 것이다.

단, 새로운 빵이 나올때마다 빵이 직원들에게 공급되어야 하는 것을 전제로 한다.

생각 해 보면 그리 어렵지 않은 것들에다가 학창시절에 한번씩 배웠던 것들인거 같은데.....

중, 고등학교 시절 수학시간에 답을 외우려고 했던 내 자신을 반성해 보게 된다. ㅎ







각설하고

위에서 설명한 대략의 이미지를 그려보면 다음과 같다.


(엑셀로 끄적여본 예시 그림. 줄도 안맞고 급조한 티가...orz)

.......

본론으로 들어가서.....

요 행동을 하려면 직원정보를 담는 컬럼과 빵을 받았는지 판단하는 컬럼, 두가지 컬럼을 필요로 한다.

그리고 직원의 수를 DB에서 가져온다면 DB연결문구를 사용하게 되겠지만, 여기에서는 생략하기로 한다.

편의상 첫번째 컬럼을 직원정보, 두번째 컬럼을 빵을 받은 여부라고 하도록 하겠다.



Dim i as Integer ''// 원조 빵셔틀
Dim matShare() as String ''// 가변 배열선언
Dim shareFlag    as Boolean


Redim matShare(10, 2) ''// 배열의 재선언 배열이름(직원의 수, 컬럼)

Do While 새로운 빵 = True    
    shareFlag = False
    For i = 1 To Ubound(matShare) ''// i는 0이 아니라 1부터 시작함
        if matShare(i, 2) = 0 then
            matShare(i, 2) = 1 ''// 빵을 받았다.
            shareFlag = True  ''// 빵플러그를 True로 바꿔준다.

            MsgBox matShare(i, 1) & " 직원이 빵을 받았습니다."
            Exit For
        end If
    Next

    if shareFlag = False Then
        For i = 1 To Ubound(matShare)
            matShare(i, 2) = 0

            MsgBox "직원들의 접시를 모두 비웠습니다."
        Next
    End If
loop


뭐 대충 생각해 봤을 때(정말 대충)

요런 코드가 나올 수가 있다.

이 방식으로 빵셔틀 변수 i 가 직원들에게 빵을 나눠줄 수가 있다.

하지만, 이 코드는 한가지(또는 여러가지가 될 수 있음 ㅎ) 문제점을 가지고 있다.

조엘 온 소프트웨어 블로그의 조엘 스폴스키의 표현에 따르면

일명 '러시아 페인트공 알고리즘' 이란 것인데,

이는 나중에 다시 짬을 내서 소개하기로 하겠다.


다시 돌아와서

그럼 뭐가 문제냐...

간단히 얘기해서 


    For i = 1 To Ubound(matShare) ''// i는 0이 아니라 1부터 시작함
        if matShare(i, 2) = 0 then
            matShare(i, 2) = 1
            shareFlag = True

            MsgBox matShare(i, 1) & " 직원이 빵을 받았습니다."
            Exit For
        end If
    Next


이 부분의 반복문이 좀 문제라고 생각할 수 있다.

위 코드에서는 변수 i 가 빵셔틀 역할을 하게 되는데

직원이 빵을 받고 반복문을 빠져나간 후

다시 반복문에 진입해서 빵을 받은 직원을 검색할 때,
 
변수 i가 직원 1번부터 다시 검색을 시작하기 때문이다.

직원 10명을 예로 들었으나 실제로 1,000명 1,000,000명으로 늘어난다면

상당히 비 효율적 검색방법 이라고 볼 수 있다.



그래서

위 코드를 조금 수정해 보았다.

새로운 빵셔틀 노릇을 할 변수 j를 추가한 코드이다.



Dim i as Integer ''// 원조 빵셔틀
Dim matShare() as String ''// 가변 배열선언
Dim shareFlag    as Boolean

Dim j as Integer ''// 새로운 빵셔틀 변수 추가함


Redim matShare(10, 2) ''// 배열의 재선언 배열이름(직원의 수, 컬럼)

j = 1

Do While 새로운 빵 = True    
    shareFlag = False
    For i = j To Ubound(matShare) ''// i는 j(빵을 받은 맨 마지막 직원의 다음번호)부터 시작함
        if matShare(i, 2) = 0 then
            matShare(i, 2) = 1  ''// 빵을 받았다.
            shareFlag = True  ''// 빵플러그를 True로 바꿔준다.

            MsgBox matShare(i, 1) & " 직원이 빵을 받았습니다."          
            j = j + 1
            Exit For
        end If
    Next

    if shareFlag = False Then
        For i = 1 To Ubound(matShare)
            matShare(i, 2) = 0

            MsgBox "직원들의 접시를 모두 비웠습니다."
        Next
    End If
loop



이렇게 코드를 조금 수정하면 좋을 것 같다.

여기에서는 변수 j 가 빵셔틀 역할을 하게 되는데

j는 i처럼 반복문에 진입했을 때 직원이 빵을 받았는지 안받았는지 하는 검사를 처음부터 하는 게 아니라

맨 마지막에 빵을 받은 직원의 다음번호를 기억했다가 거기서 부터 시작하기 때문에

회사가 엄청 잘 돼서 직원수가 많이 늘어나더라도 반복문은 최소 한번만에 끝날 수도 있는 것이다.




중간에 왠 '러시아 페인트공' 얘기가 나오면서 이야기가 조금 빗나갔지만 ㅎㅎ

가변 배열을 이용한 나만의 빵셔틀 만들기를 해 보았다.

마지막으로

만약 예제코드를 적용할 필요가 있을 때는 그대로 사용하지 말고 필드에서 반드시 테스트를 거친 후

사용하길 바란다.









블로그코리아에 블UP하기
반응형
댓글
반응형
12-05 08:33
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함