이번 문제는 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
더 좋은 문제로 만나길...
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #41 [ 테이블 정렬하기 ] (0) | 2023.03.15 |
---|---|
[기초방] VBA 100제 #40 [ 가로정렬 ] (0) | 2023.03.15 |
[기초방] VBA 100제 #38 [ 재배치하기 ] (2) | 2023.03.06 |
[기초방] VBA 100제 #37 [ Characters ] (0) | 2023.03.06 |
[기초방] VBA 100제 #36 [ 가로정렬하기 ] (0) | 2023.03.05 |
댓글