본문 바로가기
VBA

[VBA_재귀함수] 모든 경우의 수 순열구하기

by 일등미노왕국 2021. 8. 17.

  VBA를 배우는 것중 또 하나는 알고리즘을 하나둘씩 배워가는 즐거움이 있다. 최근에 가장 좋아하는 알고리즘으로는 재귀문인데 문제를 접할 때마다 풀기 싫지만 풀면 뿌듯한 뭐 이런 이상한 기분을 주는 녀석이다.

  이걸 풀기 위해서 알고리즘 관련한 사이트와 블로그를 열심히 찾아본 결과 드디어 이해를 하였기에 코드를 올린다.

(출처 : https://minusi.tistory.com/entry/순열-알고리즘-Permutation-Algorithm)

재귀함수는 호출을 하기전으로 돌아오기 때문에 종료구문을 넣어주지 않으면 무한 루프에 빠질 수가 있다. 본 알고리즘은 공백과 문자가 있는 두개의 영역에서 처음 문자가 있는 영역에서 문자가 없는 영역으로 자리를 바꿔준 다음 더이상 바꿔줄 문자가 없으면 다시 처음으로 돌아와서 문자가 없는 영역과 문자가 있는 영역으로 회기해서 위치를 바꿔주는 것이 관건이다. 이건 말로 풀기에는 한계가 있고  [F8]을 누르면서 어떻게 바뀌는지를 살펴야 한다.

코드 진행은 이렇다 

FOR I=1 TO J 에서 I=1일때, J=3

X = 공백 / Y=123

X = 1 / Y = 23

X= 12 / Y =3    LEN(Y) 길이가 2보다 작으므로 출력

X= 1 / Y = 23

X= 13 / Y = 2  LEN(Y) 길이가 2보다 작으므로 출력

X= 1 / Y = 23

X= 공백 / Y = 123

이게 FOR문을 한번 돌아갈때 이뤄지는 프로세스이다. 

 

FOR I=1 TO J 에서 I=2일때, J=3

X = 공백 / Y=123

X = 2 / Y = 13

X= 21 / Y = 3    LEN(Y) 길이가 2보다 작으므로 출력

X= 2 / Y = 13

X= 23 / Y = 1  LEN(Y) 길이가 2보다 작으므로 출력

X= 2 / Y = 13

X= 공백 / Y = 123

 

FOR I=1 TO J 에서 I=3일때, J=3

X = 공백 / Y=123

X = 3 / Y = 12

X= 31 / Y = 2    LEN(Y) 길이가 2보다 작으므로 출력

X= 3 / Y = 12

X= 32 / Y = 1  LEN(Y) 길이가 2보다 작으므로 출력

X= 3 / Y = 12

X= 공백 / Y = 123

 

모든경우의수(재귀함수).xlsm
0.02MB

댓글