Visual studio에서 디버깅을 할 때 기본적으로 제공하는 디버깅 기능을 이용하지만, 중간 결과들을 출력해서 보는게 더 빠를 때가 많다. 이때 그냥 보면 헷갈리거나 난잡하게 보이는 경우가 많다. 그래서 변경된 부분만 다른 색상으로 출력하면 괜찮겠다 싶었다.
다음은 문자열 탐색 알고리즘인 KMP 알고리즘을 통해 찾은 것이 정확한지 보는 예시다.
KMP 알고리즘
vector<int> kmp(string txt, string pattern) {
// make table
int table[101] = { 0 };
vector<int> pos;
// k는 찾을 문자열의 인덱스
int k = 0;
for (int i = 1; i < pattern.size(); i++) {
while (k > 0 && pattern[k] != pattern[i])
k = table[k-1];
if (pattern[k] == pattern[i])
table[i] = ++k;
}
k = 0;
for (int i = 0; i < txt.size(); i++) {
while (k > 0 && pattern[k] != txt[i])
k = table[k - 1];
if (pattern[k] == txt[i])
k++;
if (pattern.size() == k)
pos.push_back(i+1-k);
}
return pos;
}
위 KMP 함수는 찾은 문자열의 시작 위치 리스트를 반환한다.
글자 색상을 변경하여 출력 확인
// 색상 정의
// 색상 변경 함수
void textcolor(int foreground, int background) {
int color = foreground + background * 16;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
int main(void) {
string txt = "The banana is delicious, but banana becomes dark";
string pattern = "banana";
vector<int> pos = kmp(txt, pattern);
vector<int> color(txt.size(), 0);
for (int i = 0; i < pos.size(); i++)
color[pos[i]] = 1;
bool changed = false;
int k = 0;
for (int i = 0; i < txt.size(); i++) {
if (color[i] == 1) {
textcolor(YELLOW, BLACK);
changed = true;
k = pattern.size();
}
printf("%c", txt[i]);
if (changed)
k--;
if (k == 0)
textcolor(WHITE, BLACK);
}
printf("\n");
return 0;
}
위 코드에서 textcolor 함수가 텍스트 색상을 바꾸게 된다. 여기서 주의할 점은 일시적으로 바꾸는 것이 아니라 영구적으로 바꾸는 것이기 때문에 색상을 바꾸고자 했던 텍스트의 출력이 끝나면 다시 바꾸어주어야 한다. 그래서 위에처럼 pattern 길이만큼 출력하고 원래 색상으로 바꾸어주는 코드가 있어야 한다.
결과 화면
참고로 C#에서는 다음 코드로 아주 간단히 바꿀 수 있다. 그러나 위처럼 원래 색상으로 다시 바꾸는 코드는 있어야 한다.
Console.ForegroundColor = ConsoleColor.Red; // 텍스트 색을 빨간 색으로 변경
'R, Python' 카테고리의 다른 글
[PyQt5] Pytorch3D를 이용한 Mesh Viewer 구현 (0) | 2020.04.13 |
---|---|
[python] PyQt5로 이미지 뷰어 만들기 (간단한 라벨링 툴 만들기 1단계) (6) | 2019.11.14 |
[python] 네이트판 웹 크롤러를 만들어보자! (0) | 2019.02.13 |
[Python] 5분만에 음성 인식 구현하기 (4) | 2019.02.05 |
python 로딩(애니메이션) 쉽게 구현하기 (1) | 2019.01.23 |
댓글