(TIL) 2020-09-17 기록
업데이트:
오늘 한 일
- 오늘은 하루종일 해쉬태그 제안 기능을 위한 문자열 처리 알고리즘에 대해서 고민했다. 정말 효율적이고 깔끔한 알고리즘을 짜려고 했으나 짧은 시간 내에 안 될 것 같기도 했고 사실 우리 앱에서 캡션의 문자 수는 100자 내외가 될 것 같은데 이런 문자열 길이에서는 로그 시간이나 선형 시간이나 지수 시간이나 연산 속도에 큰 차이가 없을 것 같아 대충 이런 식으로 구현을 해보았다.
Map<String, List<TagSearchResult>> resultCache;
int MAX_CACHE_LENGTH = 10;
function onChange(text)
{
if (isInTag(text, cursor))
{
String tag = extractTag(cursor);
if (tag in resultCache)
{
showSuggestion(tag, resultCache);
} else {
searchTag().then((e) => {
putResult(resultCache, e);
showSuggestion(tag, resultCache);
});
}
} else
{
removeSuggestion();
}
}
저기서 isInTag()
함수는 현재 커서에서 앞으로 계속 탐색해 나가며 #을 발견하면 true
를 반환하고 공백 문자를 발견하거나 문자열의 시작점에 도착했을 경우에 false
를 반환한다. 지금 태그를 수정하는 중인지 아닌지를 판별하는 함수이다. 그래서 TestState
를 매번 설정할 필요가 없어졌다.
또 extractTag 같은 경우에는 현재 커서에서 앞으로 탐색하여 #의 위치를 찾고 다시 뒤로 탐색해서 공백문자가 나오거나 문자열의 끝이 나오는 지점을 저장해서 subString을 반환한다. 그런데 지금 생각해보니 아까 isInTag를 찾을 때에 이미 #의 위치를 찾았는데 또 찾는 게 비효율적으로 보이긴 한다. 함수는 한 가지의 역할만 가져야 한다는 원칙을 깨고 #의 index를 반환하게 해도 괜찮을 것 같다.
showSuggestion()
같은 경우에는 Overlay
로 제안 리스트를 보여주는 함수이고 putResult()
함수는 resultCache
의 크기가 MAX_CACHE_LENGTH
에 도달했을 경우에는 맨 앞의 것을 삭제하고 새로운 결과를 넣어주고 그렇지 않을 경우에는 그냥 새로운 결과를 넣어주는 함수이다. searchTag()
는 함수 이름에서도 알 수 있다시피 Algolia에서 Tag를 검색해서 그 검색 결과를 List<TagSearchResult>
타입으로 반환해주는 함수이다. 오늘은 시간이 없어 코딩만 하고 실행해보지 않았다.
내일 할 일
- 내일은 고강도 문제풀이 훈련일이다. 점심을 먹은 뒤부터 저녁 시간까지 쉬는 시간 없이 문제풀이를 한다. 힘들 것 같지만 또 설레기도 한다.
잡설
- 오늘 스쿼트를 하다 허리에 염좌가 와서 1주일 정도 운동을 쉴 수도 있을 것 같다. 운동하는 시간이 줄었으니 좀 더 많은 시간을 개발과 개발 공부에 투자해야겠다.
댓글남기기