1) Original
문자는 ascii 번호로 되어 있기 때문에 이를 저장할 해시맵 map[256] 을 준비한다.
그리고 각 문자가 몇개 나오는지 카운트한다.
또한 256 사이즈를 다 스캔하기에는 번거로울 수 있으니, key를 unordered set(동일한 키 추가 방지) 으로 저장해준다. (이건 이 문제의 경우, 알맞지 않은 방법이었다)
이제 카운트 숫자가 짝수인지 홀수인지 판단한다.
만약 짝수라면 그대로 더해주면 된다. 하지만 홀수라면, 그대로 더해주면 안된다.
Palindrome은 단 한번의 홀수만 허용이 가능하다. 따라서 나는 이를 위해 sig라는 bool 을 만들었고,
한번만 허용가능한 홀수가 나왔을 때, sig를 false로 업데이트해준다.
sig가 true일 경우 length에 홀수를 그대로 더해주어도 괜찮고,
sig가 false일 경우 length에 홀수 - 1, 가장 큰 짝수를 더해야주야한다.
결과로 3ms 정도의 속도가 나온다.
사실 나는 map structure을 사용하는 것을 별로 선호하지 않는다.
아래는 map을 사용해 똑같은 알고리즘을 구현한 것인데, 실험한 바로는 저장공간도 비슷하거나 좀 더 많이 필요하면서,
더 느리다. 이유는 map은 array에 접근하는 것에 비해, 캐시효율이 좋지가 않고, find를 계속 해야하기 때문인 것 같다.
동일한 이유에서, unordered_set을 사용하지 않고, 256개의 array를 그냥 스캔하는 방식으로 돌려봤다.
결과는 0ms 훨씬 빠르다.
'릿코드' 카테고리의 다른 글
264. Ugly Number II (1) | 2022.09.21 |
---|---|
121. Best Time to Buy and Sell Stock (0) | 2022.09.20 |
142. Linked List Cycle II (0) | 2022.09.20 |
876. Middle of the Linked List (0) | 2022.09.20 |
206. Reverse Linked List (2) | 2022.09.20 |