본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #46 [ 모래시계 알고리즘 ]

by 일등미노왕국 2023. 3. 19.

 

이런 류의 문제를 풀기 위해서는 반복될 기초 틀을 하나의 영역으로 잡는것이 가장 중요하다 이 한 블럭만 완성을 하면

그 다음 부터는 순환 반복이기 때문에 큰 어려움이 없을 것이다.

 

46번은 전형적으로 For each의 움직임을 이해한다면 바로 풀 수 있는 문제이고

46-1은 offset의 움직임을 이해한다면 큰 어려움없이 풀 수 있을 것이다.

 

본인의 코드를 보고도 이해가 안된다면 아직 셀기반의 움직임을 정확히 이해 못한거니 이참에 움직임을 하나씩 찍어보길 바란다.

 

 

더보기
Option Explicit

Sub 기초방46()

    Dim rngAll As Range
    Dim rngA As Range
    Dim i&, r&
    
    Set rngAll = make_rng([e4])             '= 영역 만들기
    [e4:o200].ClearContents                 '= 초기화
    
    For r = 1 To 6                          '= 만들어진 영역을 6번 반복
        For Each rngA In rngAll
        
            i = i + 1                       '= For each 움직임에 따라 +1
            
            rngA = i
        
            haja_Delay rngA
        
            If i >= 97 Then Exit For        '= 카운트 숫자가 97보다 커지면 종료
        Next rngA
    
        Set rngAll = rngAll.Offset(10)
    
    Next r
    
    Call 기초방46_1

End Sub

Sub 기초방46_1()

    Dim i&, j&, r&, Cnt&
    Dim rngX As Range
    
    Set rngX = make_rng([e4])               '= 영역 만들기
    [e4:o200].ClearContents                 '= 초기화
    
    For r = 1 To 6                          '= 6번 반복
        For i = 1 To 10                     '= 왼쪽 위에서 오르쪽 아래로 내려오는 대각선 만들기
            Cnt = Cnt + 1
            rngX(i, i) = Cnt
            haja_Delay rngX(i, i)
        Next i
    
        Cnt = Cnt + 1
        Set rngX = rngX(1, i)               '= 오른쪽 위 꼭지점 인쇄
        rngX = Cnt
        haja_Delay rngX
        For j = 1 To 9                      '= 오른쪽 위에서 왼쪽 아래로 내려오는 대각선 만들기
            If IsEmpty(rngX.Offset(j, -j)) Then
            Cnt = Cnt + 1
            rngX.Offset(j, -j) = Cnt        '= 이미 숫자가 있다면 다음 번 셀에 출력
            
            haja_Delay rngX.Offset(j, -j)
            End If
        
        Next j
 
    Set rngX = rngX.Offset(j, -j)

    Next r

End Sub

Function make_rng(rngX As Range) As Range

    Dim i&, j&, r&, Cnt&
    
        For i = 1 To 10
          
            rngX(i, i) = 1
        
        Next i
    
        Set rngX = rngX(1, i)
        rngX = 1
        
        For j = 1 To 9
            rngX.Offset(j, -j) = 1
        
        Next j
 
    Set make_rng = [e4:o13].SpecialCells(2)
    
End Function

Function haja_Delay(rngX As Range)
    Dim i&
    
    For i = 1 To 10
        
        rngX.Select
        rngX.Font.Bold = True
        rngX.Interior.ColorIndex = Application.RandBetween(1, 50)
        
    Next i
    
        rngX.Font.Bold = False
        rngX.Interior.ColorIndex = xlNone

End Function

기초방 46.xlsm
0.03MB

댓글