c++ 알고리즘 공부중인 뉴비임다
문자열 탐색 알고리즘 해야하나.. 싶었지만 혹시 몰라 시도하는 중임다
어제 오늘 총 7시간동안 문자열가지고 별 생쇼를 다했습니다.
교재는 C인데다가 utf-8은 고려도 안해서 답은 막힐 때 참고하는 수준으로만 보면서 만들어 봤습니다.
알고리즘은 총 2개, Brute Force algorithm과 Boyer Moore algorithm을 썻습니다.
테스트는 윤동주의 별헤는 밤에서 별을 검색
영어로만 된 Lorem ipsum에서 ipsum 검색
이렇게 2번씩 총 4회 했습니다.
브루트 포스법은 둘다 잘 찾습니다. 근데 보이어 무어는 영문은 잘 찾는데 별헤는 밤에서 별을 딱 1개 찾습니다.(정답은 13개)
영문은 잘되는 거보니 뭔가 UTF-8에 대한 이해가 잘못 된 것 같습니다.
분명 UTF-8이 1~3바이트로 크기가 들쑥날쑥 개판인 것은 맞지만,
어치파 char string에 박아넣으면 1바이트 단위로 잘라져서 들어갈테고
그러면 1바이트 씩 비교하나 정해진 크기대로 비교하나 결국엔 같은 결과가 나올거라 생각했습니다.
이제 더이상 뭐가 문젠지도 모르겠고 멀리서 몬티 파이썬이 비웃는 듯한 환청이 들려옵니다.
절박하기에 이렇게 영민하신 프갤 선배님들께 고개박고 부탁드립니다.
볼 것도 없는 졸자의 깃허브 레포지토리는 아래와 같습니다
https://github.com/Markgraf-Oh/Data-Structure-and-Algorithm-in-Cpp
TestString.h은 테스트용 문자열인 별헤는 밤과 Lorem ipsum이 들어 있는 헤더입니다.
StringSearch.h 와 StringSearch.hpp는 탐색 알고리즘이 있는 헤더입니다.
StringSearchTest.cpp 가 main을 돌리는 파일입니다.
나머지는 안열어보는게 눈에 좋은 저의 개똥같은 코드들입니다.
어차피 하나는 성공했으니 UTF-8 잣같네 하며 넘어가도 되겠지만 뒤통수가 간지러워서 못참을 것 같습니다...
"영문은 잘되는 거보니 뭔가 UTF-8에 대한 이해가 잘못 된 것 같습니다."
흥분하지말고 짧은 문장 부터, UTF가 변환되는 과정부터 차례대로 디버깅 해나가면 되겠네.
영문은 잘 되는거보면 다 한거네. 한글 짧은 문장부터 다시 디버깅 해봐.. UTF가 어떤식으로 char에 들어가는지부터 다시 확인해봐야 되겠네. 이미 다 알고 있구만
아 역시 VScode로 안하고 VS로 디버깅하니 바로 이상한데 접근한다고 뜸. 알고보니 char를 int로 바꾸면서 -가 되버린... 영어는 +구간에만 있어서 문제 없던거고. -CHAR_MIN해주니 해결
상위 비트 검사하는거만 잘해도됨
아 이 그지같은거 후딱 끝내고 트리랑 그래프 할라 했는데... 으으 내일도 끙끙대봐야 겠다
"그러면 1바이트 씩 비교하나 정해진 크기대로 비교하나 결국엔 같은 결과가 나올거라 생각" <- 이부분은 위험합니다. 보이어 무어 알고리즘은 유효 글자 단위로 쉬프팅을 해야할텐데 CJK문자에 대해 단순히 char(8비트)취급을 해서 처리하면 안되고, 쉬프팅 시 밀려나는 문자와 새로 들어올 문자 각각의 실제 바이트사이즈가 반영되어 비교 블록의 바이트크기는 유동적으로 변할수 있음을 전제로 해야 합니다.
너무 겁먹을 필요는 없는게 UTF-8 문자열은 특정 바이트를 딱 찝었을때 그 바이트가 1/2/3/4 바이트 문자인지를 추적할 수 있습니다. 이게 핵심일거 같네요.
(그리고 UTF-8은 1~3이 아니라 1~4까지입니다. 애초에 출범 시에는 1~6이었는데 표준규격화 되면서 1~4로 픽스됨)
일단
https://www.gamedev.net/tutorials/_/technical/general-programming/how-about-unicode-and-utf-8-r3322/
여기 가서 그림을 보면 대충 어떤식으로 가늠하는지의 판단이 가능할겁니다. (c/c++ 사전지식이 어느정도인지 모르지만 비트연산만 다룰줄 알면 쉬운 부분입니다.)