알파벳을 까먹었다가 기억해냈다가 할 때 각 상황마다 알고있는 단어의 개수를 출력하는 문제입니다. 생각보다 주어지는 단어와 쿼리의 개수가 많기 때문에 문자열을 있는 그대로 받아 연산을 진행하기에는 시간이 부족합니다. 그래서 생각해낼 수 있는 방법이 입력으로 주어지는 단어에 어떤 알파벳이 포함되어있는지만 저장하는 것입니다. 어차피 apple
이나 pale
이나 leap
이나 다 a, e, l, p를 알고 있으면 만들 수 있는 단어이기 때문입니다. 또한 어떤 알파벳이 포함되어있는지를 배열로 저장하면 이것 또한 시간을 늦추는 원인이 됩니다. 따라서 비트마스킹을 사용하여 저장할 수 있습니다. 알파벳은 총 26개이므로 int
의 비트 수인 32보다 적기 때문에 int
면 충분합니다.
이제 현재 알고있는 알파벳을 저장하는 변수와 각 문자열 별로 문자열을 구성하는 데에 최소로 필요한 알파벳을 각각 int
하나로 저장합니다. 이제 알파벳을 까먹거나 기억해낼 때 현재 상태를 저장하는 변수를 수정해가면서 각 문자열마다 AND
연산을 통해 단어를 만들 수 있는지 판별하여 그 개수를 세면 됩니다.