(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주일 정도 운동을 쉴 수도 있을 것 같다. 운동하는 시간이 줄었으니 좀 더 많은 시간을 개발과 개발 공부에 투자해야겠다.

태그:

카테고리:

업데이트:

댓글남기기