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

[기초방] VBA 100제 #39 [ 문자조합하기 ]

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

 

이번 문제는 characters  + 정규식 문제의 확장편 정도로 생각해주면 좋을것 같다.

 

39번 문제는 [이전] 데이터를 보면 알겠지만 처음을 제외하곤 숫자 뒤에 % 가 4자리씩 순환하고 있는데 이걸 나머지 숫자에도 %을 삽입하라는 문제이다.

 

39-1은 이웃하지 않은 알파벳과 숫자의 조합으로 조합문자를 만들어 내는 것이다. 

 

39번은 정규식으로 풀려면 패턴을 일치시켜야 하기에 정규식 패턴을 다음과 같이 만들어 보았다.

 

패턴설명은 뒤에 % 가 없는 숫자를 패턴으로 하는 정규식 패턴이다.

 

firstindex는 일치 패턴의 바로 직전까지를 의미하기 때문에 firstindex + cnt를 함으로서 글자가 삽입되더라도 그 위치를 변경해가면서 결국 의도한대로 패턴과 일치된 숫자들 뒤로 %  를 삽입할 수 있다.

 Set Mat = Reg.Execute([d9])
    
    Cnt = 1
    For i = 0 To Mat.Count - 2
    
       [d9].Characters(Mat(i).firstindex + Cnt, 1).Insert (Mat(i) & "%")
       Cnt = Cnt + 1
    
    Next i

39-1 의 문제는 ABS(절대값), ASC(아스크코드값), CHR(char) 함수를 아느냐 모르냐에 달려있다.

이웃하지 않으려면 이전 생성된 문자또는 숫자와 새로 생성된 문자와 숫자 사이의 차이가 1을 넘어야 한다.

가령 A= CHR(65) / B= CHR(66) 이기 때문에 이 차이를 통해서 이웃했는지 아닌지를 파악할 수 있다.

If Abs(Asc(Right(Str, 2)) - Asc(nStr)) > 1 And Abs(Asc(Right(Str, 1)) - Asc(nNum)) > 1 And InStr(Str, nStr) = 0 Then

INSTR(str,nstr) = 0 의 의미는 기존 조합된 문자열에 새로 생성된 알파벳이 있는지 없는지를 확인하는 작업이다.

 

 

 

더보기
Option Explicit
Sub 기초방39()

    Dim Reg As Object: Set Reg = CreateObject("vbscript.regexp")
    Dim Mat As Object
    Dim Cnt&, i&
    Dim str$, nStr$, nNum&
    
    [h9].Copy [d9]
    
    With Reg                                    '= 기초방 39번 해법
        .Pattern = "\d(?!%)"                    '= 숫자뒤에 %가 없는 숫자를 패턴으로 함.
        .Global = True
    End With
    
    Set Mat = Reg.Execute([d9])
    
    Cnt = 1                                     '= %가 삽입된 후 변경된 위치를 카운터 하기 위한 변수
    For i = 0 To Mat.Count - 2
    
       [d9].Characters(Mat(i).firstindex + Cnt, 1).Insert (Mat(i) & "%")    '= 패턴에 해당하는 위치에 % 삽입
       Cnt = Cnt + 1                            '= 다음 위치를 위해 +1
    
    Next i

    Do Until Len(str) = 26 * 3                  '= 기초방 39-1 해법
    
        nStr = Chr(WorksheetFunction.RandBetween(65, 90)): nNum = WorksheetFunction.RandBetween(0, 9)  '= 풀이를 위한 랜덤 수 작성
        
        If str <> "" Then                       '= 처음이 아니면
        
            If Abs(Asc(Right(str, 2)) - Asc(nStr)) > 1 And Abs(Asc(Right(str, 1)) - Asc(nNum)) > 1 And InStr(str, nStr) = 0 Then
           '= 문자 숫자의 이전값과 새로 생성한 문자 숫자의 아스키코드값의 절대값을 비교하여 1보다 크고 / str안에 새로 생성한 값이 없다면
           
                str = str & "%" & nStr & nNum
                
            End If
                
        Else: str = str & "%" & nStr & nNum     '= 처음이면
            
        End If
      
        Haja_delay str
    Loop
    
    MsgBox "조합을 완료했습니다."
End Sub

Function Haja_delay(str$)

    Dim i&
    
    For i = 1 To 150
    
         [d11] = str                                 '= 조합된 문자를 출력해라
    
    Next i

End Function

 

기초방39.xlsm
0.02MB

더 좋은 문제로 만나길...

댓글