티스토리 뷰
반응형
별로 거창한 내용은 아니다. ㅎㅎ
이름도 대충 내가 붙인거니 신경쓰지 말고..
예를들어 이런거다.
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처럼 반복문에 진입했을 때 직원이 빵을 받았는지 안받았는지 하는 검사를 처음부터 하는 게 아니라
맨 마지막에 빵을 받은 직원의 다음번호를 기억했다가 거기서 부터 시작하기 때문에
회사가 엄청 잘 돼서 직원수가 많이 늘어나더라도 반복문은 최소 한번만에 끝날 수도 있는 것이다.
중간에 왠 '러시아 페인트공' 얘기가 나오면서 이야기가 조금 빗나갔지만 ㅎㅎ
가변 배열을 이용한 나만의 빵셔틀 만들기를 해 보았다.
마지막으로
만약 예제코드를 적용할 필요가 있을 때는 그대로 사용하지 말고 필드에서 반드시 테스트를 거친 후
사용하길 바란다.
반응형
'VB 6.0 & java(JSP, Servlet) etc' 카테고리의 다른 글
[VB 6.0] VB사용자를 위한 깨알같은 팁 - 아스키 코드의 활용 (0) | 2009.10.21 |
---|---|
[vb 6.0] 프로시져 실행 결과는 미궁속으로 - <개체가 닫혀있으면 작업이 허용되지 않습니다.> (0) | 2009.09.15 |
[VB6.0] VB로 Excel에 이미지 호출후 붙여넣기 (0) | 2009.08.05 |
[vb 6.0] StrConv함수와 인자값에 대한 설명 (0) | 2009.07.16 |
HelpConstants - CommonDialog의 Flags 속성 (0) | 2009.07.07 |
댓글
반응형
12-05 03:08
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 플래쉬 게임
- 플래시
- 8비트
- xml강좌
- 틀린그림찾기
- 오락실 게임
- 플래시 게임
- 브롤스타즈
- XML Programming with VB 6.0
- 플래쉬게임
- 고전명작
- 다른그림찾기
- 중독성짱게임
- 엑셀
- brawlstars
- C
- 8비트상성
- XML
- 오락실게임
- 좀비게임
- 고전게임
- SQL
- 레트로게임
- 플래시게임
- MS-SQL
- Excel
- 플래쉬
- 추억의 게임
- J.S Bach
- c#
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함