본문 바로가기
VBA

[VBA] 모래시계 알고리즘

by 일등미노왕국 2022. 5. 18.

최근에 같은 오픈챗방 크루인 VBA공부중님께서 

알고리즘에 흠뻑 빠져있다. 본인의 2년전 모습을 보는거 같아 개인적으로 너무 흡족하다... 본인의 2년전보다 훨씬 빠르고 날카로운거 같다. 다른 언어도 좀 맛봐야 하는데 이렇게 후배들이 치고 올라오면 본인 역시 긴장하고 더 공부해야 한다는 강박이 생긴다.

 

본인 블로그에도 알고리즘 관련 글을 올리곤 했는데, 오늘 VBA공부중님께 자극받아 하나 올린다.

이런 알고리즘의 해법은 이렇다.

 

일단 모래시계 모양의 영역을 먼저 설정 후 번호는 순차적으로  For Each문으로 입히면 되는데,

1번부터 25번까지는 영역이 가운데를 기준으로 양쪽 하나씩 줄여나가야 하며, 24번 이후는 다시 양쪽 기준으로 +1씩 늘어간다.

 

시작점에서 다음 시작점은 현재 시작점.offset(1,1)의 위치이다.

영역의 크기는 9 , 7, 5, 3, 1이다.

 

이것을 수식으로 표현하면 Resize(1, 9 - (2 * N)) 이며 , 값은 0부터 시작한다.

 

Do until ~ loop문으로 크기가 0보다 작을때까지 무한 순환하게 되는데 순환할때 마다 다음 시작점은 offset(1,1)을 하게 되는데 영역의 크기가 1보다 클때까지만 offset(1,1)을 해야 함으로

If 9 - (2 * N) >= 1 Then Set rngX = rngX.Offset(1, 1)  이 구문이 사용되어야 한다.

 

상층부가 영역을 2n값으로 영역을 줄여갔다면 하층부는 영역을 2n값으로 영역을 늘여가야 함으로 N값의 변화와 비교를 주목해 보길 바란다.

 

알고리즘 문제는 코드의 개괄적인 설명만 하고 주석을 최소화하도록 하겠다.

오늘도 코딩형 인간으로 진행중이다.

 

모래시계(22.05.17).xlsm
0.02MB

댓글