2020년 8월 31일 월요일

PIP Install 중 disutils installed ... Error

pip로 패키지 install 중, 아래와 같은 오류가 발생할 때 해결법


- 에러메시지

Cannot uninstall 'pytz (pkg name)'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall. 


- 해결방법 : 걍 설치된 버전 무시해버려! 

pip install --ignore-installed pytz


2019년 2월 18일 월요일

SSGPAY 실행시 '보안 점검 중입니다' 라고 뜨고 멈춰있을때 해결 방법

안드로이드폰 (갤럭시 노트9) 에서 SSG Pay가 어느날 갑자기 로딩이 안되기 시작했다.
관련 프로세스를 모두 강제종료하고 다시 띄워도 계속 '보안 점검 중입니다' 만 나오고 아무것도 앱에서 할 수 없었다.

해결방법을 찾다보니 똑같은 케이스를 딱 하나 발견할 수 있었고, 별다른 해결책은 없었다.
(https://www.clien.net/service/board/kin/11526095)

결국은 실행을 포기하고,
재미있게도 우연히 이 타이밍에 (LPoint 앱이었나) 유사한 금융 / 포인트 앱을 켜니
V3 Mobile Plus 2.0이 정상 실행중이지 않으니, 이를 실행하고 재실행하라고 안내 오류 메시지가 떴다.

이걸 보자마자 이거구나....하고 V3 Mobile Plus 2.0을 찾아서 직접 실행하고 SSG Pay를 실행시키니 정상적으로 로딩된다.

결국 또 문제는 (모바일 뿐만 아니라) 여기저기서 오류투성이인 보안앱 때문이었던건가,
또 이걸 앱에서 Reset하고 재기동하는건 불가능했던건가,
무한대기가 아니라 이에 대한 오류 메시지를 정상적으로 노출시키는건 어려운 일이었을까,
등등등 쓸데없는 생각을 했다.

아무튼 동일 증상을 겪을지도 모르는 누군가를 위해 남겨놓는다.

2019년 2월 11일 월요일

쏘카의 제로카와 함께한 2년간의 여정과 소회

쏘카에서 출시한 제로카 (https://zerocar.socar.kr/) 를 제로카 1기로서 2년간 운영한 소회를 적어본다. 아래는 먼저 그간 썼던 관련 포스팅을 옮긴다.


(1) 제로카 셰어링 당첨, 그리고 차량 인수
http://visionigniter.blogspot.com/2016/07/blog-post.html

(2) 제로카 셰어링 한달 사용기
http://visionigniter.blogspot.com/2016/08/blog-post.html

(3) 제로카 셰어링 8개월 운영기
http://visionigniter.blogspot.com/2017/03/8.html


그래서 제로카는 뭐하는 상품인가, 등에 대한 내용은 위의 글들을 참고.
본인은 1기였기 때문에 이후에 출시된 2기, 플러스 등보다 조건이 괜찮았음에도 운영에는 정말 고난이 많았다. 정말 많은 문제들이 있었는데, 이를 모두 범주화하기는 힘들지만 대략 그룹지어보면 아래와 같다.

* 제로카 파트너 커뮤니티에 공유되거나 필자가 직접 찍고 기록했던 실제 사례들 중 매우매우(x100) 일부를, 이해를 돕기 위해 중간 중간 첨부했다. 

# 주차문제

제로카를 이용 후 오주차 하는 경우이다. 지정된 위치에 차를 세우지 않는 것 외에 이중주차해서 다른 차량을 막거나, 차들이 다니는 통로에 차를 세워버리거나, 불법주차 딱지를 떼는 구역에 세우거나, 등등의 상상할 수 있는 모든 황당한 주차 케이스를 생각하면 된다.

커뮤니티에 올라온 주차 관련 글과

당시의 사진

주차장이 매우 충분하거나, 제로카를 위한 주차면을 단독으로 확보할 수 있는 곳이라면 그닥 발생하지 않을 문제같지만 주택가에서 제로카를 운영하는 경우 그렇지 않은 경우가 대부분이다.  제로카 상품 자체가 아파트 단지 등 주거지에 두는 것을 타겟으로 하는데 - 즉, 서비스 이용을 위한 Last Mile을 줄이는 효과를 기대하는 - 특히 서울 시내 아파트들의 주차장 사정은 그렇지 못하다. 오래된 아파트 단지라면 말할 것도 없이 이중, 삼중 주차가 난무한다.

쏘친 (쏘카에서는 쏘카를 이용하는 고객을 쏘친이라 부름)이 주차 공간이 넉넉치 않을 시간에 차를 빌려 사용 후 반납한다고 생각해보자. 보통 오밤중, 새벽이 이에 해당되는데, 더 나쁜건 이 시간대에 이용이 집중된다는 것이다. 역으로 생각해보면 이는 일면 당연한게, 대중교통은 끊기고 택시는 비싸지는 시간대이다.

차를 이용하고 주차할 공간이 없는 경우, 지정 위치를 벗어나 엉뚱한 곳에 반납하거나 이중주차를 하는 등의 경우가 발생하게 된다. 정상적이라면, 이 일은 아래 두가지 경우로 종료되어야 한다.

1) 지정 위치가 만차라 다른 어딘가에 주차해 두었음을 앱과 고객센터를 통해 남겨두기
2) 이중 주차시에는 다른 차량의 통행에 방해되지 않게 적절히 주차해야 하며, 당연히 다른 차들을 위해 기어는 중립, 사이드 브레이크는 해제하여 주차

하지만 불행한건 이렇게 정상적으로 끝나지 않는다는 것이다.
직접 경험한 일들만 풀어도 한시간 넘게 얘기할 수 있을텐데 최대한 간략하게 일어나는 일들을 순서도로 풀어보면 아래와 같다.


제로카 파트너의 '고난의 행군'


몇가지 사례들만 좀 더 상세히 기술해보면…

쏘카 이용 후 반납 가능/허용 영역 (GPS를 이용해 해당 차량이 지정 구역에 들어오지 않은 경우로 판단되는 경우 반납처리가 되지 않는다) 은 제로카의 경우 우편번호 구역 수준이었는데, 서울에서의 우편번호는 보통 아파트 단지 한개 정도를 커버하게 된다.

예를 들어 원래 지정 위치가 1동 주차장인데 여기에 자리가 없어 13동에 주차했다치면, 다음 이용자는 당연하게도 차를 찾기 어렵고 고생을 하게 된다. 여기서 벌어지는 각종 해프닝들이 있고.
새벽에 엿먹은, 예를 들면 이런 에피소드
또 이중주차를 하고는 기어를 P에 두고 차문을 잠가 반납하거나, 멀쩡히 자리가 비어있는데 자기 집앞 가까운 곳에 세우고 아무런 기록을 하지 않거나, 등등등등 정말 끝도 없다.

새벽마다 차의 위치를 확인하는 일은 2년간 매일 했고,
거의 3일에 한번씩은 쏘카 고객센터와 함께 차가 어디있나 GPS와 경적을 동원해 찾고, 이를 정위치 시키는 일을 해왔다. 이런 류의 일이 상기 순서도의 '제로카 파트너의 빠른 뒷처리'에 해당한다.


# 차량 사용 전/후 관리문제

이 또한 상당 부분 결국 쏘친의 ‘소양'의 문제인데, 문제는 이 관리의 책임은 파트너에게 지워진다는 것이다.

아래 문제들은 모두 실 사례들이다.

1) 쏘친의 차량 운행중 사고 발생 후 미신고
사용 후 범퍼, 휠에 스크래치, 문짝이 찍혀있거나, 등등
퇴근길에 확인한 사고 현장
범퍼를 이렇게 찍어놓고도, 인지한 상태로도 신고하지 않는다.

2) 차량 내/외부 오염
담배 냄새가 나거나, 개똥이 있거나(뒷좌석에 박스, 그리고 거기엔 개똥만이 남아있었다는...)  고양이 털로 난리가 나 있거나, 뭔 자재를 잔뜩 싣고 운행하여 차량 내부에 부스러기와 스크래치가 심하거나, 등등등등
고양이털 스토리 


# 기타

1) 밤새 비가 왔는데 새벽에 차를 확인하니 차 창문이 열려있어... 
확인하니 뒷좌석에 비가 들이쳐 고여있고..

2) 피임 용품과 이벤트 속옷(!!)이 차에 굴러다니거나...
사진에서나 보던 이 친구의 정체를 첨에 못알아보고 한동안 이리 펴보고 저리 펴보고 하다가 이것의 정체를 깨닫게 되었다. --;;;
(차에서 뭘 하던 난 별 상관없는데 깨끗하게 사용하고 치우란 말야!)
차량에서 발견된 증 제1호. 본명 '에블린 갈라빤스'

3) 실내등을 켜놓고 시동을 꺼 차량이 방전 상태가 되거나...
토요일 아침에 느닷없이 쏘카 고객센터로부터 전화가 와서는, 제로카 차량이 방전 상태인데 가서 시동을 키고 조치를 하랜다. 밤새 나갔다 온 차량이 어디 주차되어 있는지 알지도 못하고, 게다가 나는 일정이 있어 나가야 하는 시간이었다.

짧지 않은 시간으로 두어번 통화했는데, 나의 입장은 “이 문제는 차량을 이용하고 비정상 반납한 사람이 책임져야 하는 상황 아니냐, 그리고 나는 그 시간에 온전히 쏘카 플랫폼에 제로카를 임대했으니 그 사람이 조치를 못한다면 쏘카에서 알아서 처리할 일이다.” 이었고,

내가 조치할 상황이 아니었으며 태도의 완강함을 인지한 쏘카는 놀랍게도 아파트 관리사무소에 전화를 했다.(!!!!!!) 관리사무소에서는 당연히 다시 나에게 인터폰이 왔고, 결국 나는 어디있는지 모르는 방전되어가는 차량을 찾아 나서야 했다.

차를 찾으러 가고 있는 길에…차를 거의 찾았을 때쯤  뒤에서부터 경비아저씨들이 자전거를 타고 뭔가 짜증내며 접근해 오고 있었다.

단어하나 틀리지 않고 당시 문장을 그대로 옮겨보면…
“어이~ 박씨! 차 한대 찾아봐! 하얀색 아반떼라는데!! 어떤 미친놈이 차 등을 켜놓았서 방전되었다고 그 차  찾아서 꺼달라는데 뭔소리여 이게!!”

차를 찾은 나는 '박씨 아저씨'를 쫓아가며
“이 차 이구요, 제가 조치하겠습니다. 죄송합니다.” 하고 보내드렸다.

신고/연락받은대로 차는 방전되어 있어 스마트키로 차가 열리지도 않았고, 수동으로 열어 시동을 거니 당연히 시동도 걸리지 않아 나는 긴급 정비 서비스를 호출해야 했다. 견인차의 점퍼 케이블로 시동을 걸고, 정비사님은 “30분 정도는 시동 건대로 두셔야 합니다" 하고 가셨다.

그 날 나의 일정은 취소되었고 차에 덩그라니 남아 앉아, 내가 쓴 시간과 스트레스, 기회비용 등에 대한 어떠한 보상도 당연히 없었다.

# 쏘카의 응대, 운영정책

응대, 그리고 그들의 운영 정책과 관련한 할말도 많지만 큰 틀은 “이익은 내 것, 손해와 책임은 너의 것. 하지만 우린 파트너지.” 정도로 요약할 수 있겠다. 할많하않.

가해자 불상 사고는 누구의 책임일까?


고객센터 응대와 관련한 한가지 에피소드만 풀어보면, 약 1년전 다른 일정으로 해외에 있을때였다. 한국 시간으로 아침에 쏘카 고객센터, 관리사무소로부터 줄창 전화가 오길래, 또 무언가 주차 관련 문제가 발생한 불행한 느낌을 확신하며 전화를 받았다.

차량 주차 문제일테니 로밍중이지만 전화를 받고, '로밍중이니 최대한 빨리 얘기해달라’ 하니 ‘네 알겠습니다' 하더니 늘상 그들이 하는 프로세스 그대로 천천히 그리고 친절히 읊기 시작한다.

‘그럼 소중한 고객 정보 확인을 위해 몇 가지 여쭤보겠습니다. 차량번호와 전화번호, 성함을 말씀해주시겠습니까?’

심지어 어김없이 잘못된 이중 주차 때문에 관리사무소, 경비실, 차주들로부터 항의전화가 빗발치고 있는 상황에서도, 누구인지 알고 전화를 해놓고서도, 이들의 프로세스 준수는 어마어마했다.  (당연히, 비단 이 에피소드 상황만이 아니다.)

이때 심지어 타이밍은 기가막히게도 입국 심사를 받던 타이밍이라, 전화를 빨리 끊으라고 두번이나 심사관으로부터 협박 당해야 했다. --;

국내 다른 지역으로의 출타, 혹은 해외 출장의 경우 이들의 이런 기계적이고 일률적인 응대, 지연으로 파생/확대되는 문제들은 정말 심각해졌다. 어떻게 이렇게 기계적이고 한심할까 싶을 정도로 같은 정보를 되묻고, 여러명이 돌아가며 묻고 등등.

* 그나마 이후에 좀 바뀐 응대 프로세스는
“010-1234-1234, 12호 1234 차량 고객님, 홍길동님 맞으십니까?”를 확인하는 것으로 약간 단축되었다.

# 그들의 마무리

끝으로 매우 정을 떼게 한 사건은 그들의 쿨한 마무리였다.

1년의 제로카 사용 계약이 마무리되던 시점에 제로카 고객센터로부터 전화가 와서
“연장 대상이 아니다. 차량은 언제 반납하면 되니 언제 시점까지 차량을 구성품과 함께 지정위치에 두시면 된다" 라고 안내를 받게 되었다.
불연장 사유가 뭐냐고 물으니 “본인은 아르바이트라 잘 모르겠는데, 주차장 문제인것 같다” 라고만 답을 한다. 불연장 사유에 대해 최소한 명확히 얘기해줘야 하는것 아니냐. 사유를 확인해서 알려달라, 단순 통보는 납득하기 어렵다고 하니 확인 후 전달 드리겠다고 하고 1차 통화는 종료.
하루 정도 지났나. 제로카 고객센터로부터 재차 전화가 왔고, 짜증난 목소리의 담당자가 물어온다. 마지막까지 시종일관 짜증난 목소리였고 나한테 되려 따지는 목소리였다.
이어지는 대화는 대략 아래와 같다.
담: 계약 해지 관련 문의했다고 들었다. 뭐가 궁금한거냐.
나: 계약 해지 사유에 대해 정확히 알고 싶다고 얘기했다.
담: 운영중인 위치의 주차장 상태가 좋지 않아 해지된거다. 이중주차 등으로 민원이 많이 들어오지 않냐. 무슨 설명이 더 필요하냐?
나: 주차장 문제라고만 하고 정확히 설명듣지 못했다. (매우 일부만 적은 위의) 개고생들을 2년 동안하고, 당신들이 맨날 ‘파트너'라고 지칭하던 이들에게 이따위로 단순 통보하는게 말이 된다라고 생각하냐.
담: (그제서야…) 앞으로 주의하겠다. 
2년 동안 '파트너'로 지칭하며 쏘카를 대신해 온갖 관리와 개고생을 하던 사람들에게 최소한의 예의도 없이 정확한 안내도 없이, 배려도 없이, 심지어 예의도 없이, 프로세스에 따라 단순 통보하고 털어버리는 쿨함에 놀랐다.

당시 쏘카 고객센터, 그리고 계약 등과 관련한 모든 통화는 녹취했기 때문에 이 기록 자체도, 당시의 상황, 그리고 전화온 담당자 이름도 정확히 알고 있지만 그게 중요한건 아니니 생략...

# 마치며

카쉐어링, 그리고 제로카와 같은 BM은 아무튼 정말 좋은, 더군다나 고등어와 삼겹살을 심하게 구워 미세먼지가 날로 심해지고 있는 한국에서 꼭 필요한 환경 친화형 사업이라 생각하지만 아직은 갈길이 정말 너무나 멀다는걸 처참하게 느낀 2년이었다.

2년간 거의 매일 새벽 6시 전에 차량의 위치를 확인하고 이동주차 처리 등을 해오고,
아무리 늦은밤에 혹은 악천후에 퇴근해도 차량의 위치와 상태를 확인하고 정상적인 주차 위치로 옮겨놓고, 자다가도 밖에서 경적 소리가 울리면 깜짝깜짝 놀라고,
모르는 번호나 쏘카 고객센터, 관리사무소로부터 아침에 전화가 오면 긴장하며 받고,
주말 아침에는 인터폰에 긴장하고.

지나고보니 어떻게 이걸 해내왔나 싶을 정도로, 어떻게 그렇게 지냈온 것이었는지.
지금도 출근길, 퇴근길에 새삼 평안함을 느낀다.


나의 계약은 종료되었고, 앞으로도 이를 다시할 생각은 없지만...

공유 경제의 지향점, 선순환 싸이클을 무너뜨리는 이들을 이 시스템 내에서 완전히 제거할 수 있도록 전반적으로 좀 더 Incentive와 Penalty를 훨씬 정교하게 설계하고 보완/운영하는 사업자가 나와 이런 형태의 서비스가 모쪼록 성공하길 바라며,

그리고 '공짜로 차를 이용한다', '저렴하게 내 차처럼 사용한다' 라는 프로파간다와 허상의 이면을 알리기 위해,

생각나는대로 좀 적다보니 처음 적으려던 것보다 길어졌다.  끝.

2019년 2월 6일 수요일

[독서] 어디에 살 것인가

어디에 살 것인가: 유현준 저


알쓸신잡으로 유명세를 탄 유현준 교수의 책이다.
어려운 내용 없이 쉽게 여러 사례들을 들어 도시와 건축에 대해 새로운 뷰를 가질 수 있게 해준다. 이 책을 다 읽고나니 지나다니며 보이는 고층 건물들과 디자인, 공간들이 새로운 의미로 눈에 들어온다.

생각나는 재미있었던 내용 몇가지만 기록.

  • 도시의 확대에 따라 차도폭이 점차 넓어져 사람 사이의 교류는 줄어들고, 거기에 전자상거래와 물류의 발달로 종국에는 식당, 미장원처럼 내 몸에 직접 서비스를 받아야 하는 상점만 남을 것이다. 
  • 교도소와 학교의 구조적 유사성. 담장에 둘러싸인 대표적 건물들이며, 정방형의 건물에서 똑같은 옷, 똑같은 생활을 강요받는다. 창의적 교육이 가능한가?
  • 3차선 법칙. 왕복 3차선이 넘어가면 사람들은 다른 구역으로 넘어가기 어렵다. 큰 부담없이(?) 무단횡단이 가능한 차도의 폭은 대략 왕복 3차로 수준이며, 이렇게 블록이 연결될때 상권이 자연스럽게 확장된다.
  • 단상위에 서는자의 권력. 오페라 극장 구조에서의 권력 구조. 높이,층고,상하가 주는 심리적 효과. 

[독서] 목표, 그 성취의 기술

(올해는 읽은 책들을 대충, 짧게라도 적어보려 한다.)

목표, 그 성취의 기술 : 브라이언 트레이시 저

연초를 맞아 읽은 그렇고 그런 자기계발, 목표 성취 관련 책.
예전에 '기술'이라는 단어에 혹해서 챙겨두었던 책인데, 연초에 마침 눈에 띄어 집어 들었는데.....역시나 읽는데는 정말로 조금의 시간밖에 들지 않았다.

두껍지도 않은 책이지만 '기술적' 내용의 큰 줄기는 Plan-Do-See Cycle에서 크게 벗어나지 않는다. 나머지는 앞뒤로 자신감, 실행력, 꿈꾸기... 등의 메타적인 내용들.

따로 요약이랄 것도 없이 그냥 매 장 마지막에 있는 내용들을 붙인다.
























2019년 1월 14일 월요일

2019년

오랜만에 블로그에 글을 적어본다. 
2018년에 하나도 글을 쓰지 않았다는 점이 새삼 놀랍다.

뭔가 끄적거리려다가도 Blogger 플랫폼자체가 맘에 안드는 것도 있었고,  (분류, 에디터, 포맷, ...) 안쓰다 쓰려면 시간 아까운 느낌도 있고, 아주 약간 부담도 되고. 

올해는 그래도 몇자 적어보려 한다. 
특히 스마트폰 덕에 독서량이 대폭 줄었기에 올해 계획 중 일부인 독서와 관련한 기록은 아주 약간이라도 트래킹할겸 남길 예정. 

2017년 9월 5일 화요일

Python Dynamic Programming (Longest Palindrome)

언어가 뭐시 중헌디, 이겠지만 교육 / 강화학습 관련으로 간만에 Python으로 Dynamic Programming을 짜본 김에 오랜만에 Algorithm정리도 하며 기록을 남김.

* 강화학습(Reinforcement Learning)에서 MDP (Markov Decision Process)에서의 상태 천이는, 이전 State까지의 연산결과 값을 이용하기 때문에 Dynamic Programming Technique과 직접적으로 연관된다.

(벌써 10년도 더 전에 ㅠㅠ C로 복잡스럽게 짰던 기억이 아련히 스쳐간다.)


o 문제 정의
  • Input Text에서 Palindrome의 최대 길이 구하기. Longest Palindrome Substring, Search 등으로 보통 이야기 하는 문제. 
  • Palindrome은 우리말로 '회문'이라 한다. "madam"처럼 앞으로 읽으나, 역순으로 읽으나 똑같은 단어/어절이 되는 문자열을 의미한다.  


o Dynamic Programming
Dynamic Programming로 풀수 있는 문제는 두 가지 특성을 만족한다.
  • Optimal Substructure
    • Subproblem들의 솔루션을 조합하여 Global Optimum을 구할 수 있다. 
    • 즉 이전 단계(Subproblem 1)의 Best솔루션 + 현재 단계(Subproblem 2)의 Best Solution = 다음 단계의 Best 솔루션
  • Overlapping Subproblem
    • 점화식을 가지는 Recursion 구조라 생각하면 쉽다. 대표적으로 피보나치 수열처럼 이전 단계의 Subproblem의 해를 다음 단계를 위해 재귀적으로 계속 재이용한다. 
상기 이유로, DP를 짜기 위해서는 문제를 점화식 구조로 바꿀 수 있어야 한다.  그럼 Palindrome 문제를 점화식 문제로 정의해보자.

o Palindrome 문제의 점화식 (Recurrence Formula)
  • f(text) = ...
    • 0, if n = 0
      • text 길이가 0이면 당연히 longest value = 0
    • 1, if n = 1
      • text 길이가 1이면 당연히 longest value = 1
    • 2 + f(text[2:n-1]), if n>1 and text[1] = text[n]
      • n이 1 이상이고 첫글자와 끝 글자가 같은경우 (예를 들어 "madam" 같은 경우)
      • 일단 길이가 2 이상이니 2 + f(ada) 수행
    • max(f(text[1:n-1]), f(text[2:n]), if n>1 and text[1] != text[n]
      • 첫글자와 끝 글자가 다른 경우, (예를 들어... "abededeaace" 와 같은 경우)
      • 첫글자를 제외한 f(bededeaace), 끝 글자를 제외한 f(abededeaac) 중 큰 값을 취한다. 

o 위 점화식을 그대로 Recursion Version으로 구현해보자. 
def computeLongestPalindrome_recur(text):
    input_len = len(text)
    
    if input_len == 0: 
        return 0
    
    elif input_len == 1: 
        return 1
    
    elif (input_len > 1) and (text[0] == text[-1]): 
        return 2 + computeLongestPalindrome_recur(text[1:input_len-1])
    
    elif (input_len > 1) and (text[0] != text[-1]):
        return max(computeLongestPalindrome_recur(text[:input_len-1]), computeLongestPalindrome_recur(text[1:input_len]))
    
    return 0

이 짧은 몇줄로 구현되는건 신나지만 계산 복잡도가 높기 때문에, text가 조금만 길어져도 답을 구하는게 불가능할 정도로 계산시간이 엄청나게 증가한다.


o DP Version Code 
Optimal Substructure, Overlapping Subproblem 특성을 이용하려면 이를 어딘가에 저장해두고 재이용하면서 점진적으로 다음 step을 계산해 나가야 한다.

C, C++에서는 전역적으로 이 Overlapping subprogram 결과물을 저장할 변수를 array로 미리 정의하여 잘 만들어두고 index로 access 해야 한다. 하지만 Python에서는 collection의 defaultdict를 쓰면 이 과정이 너무너무x100 간단하게 해결된다. (사랑해요 파이썬 -.-)

각 위의 각 step에서 계산 결과물을 저장할 공간을 두는 것 외에는 코드가 거의 똑같다.

from collections import defaultdict
memory = defaultdict(int)

def computeLongestPalindrome(text):
    if text in memory: 
        return memory[text]
    else:
        text_length = len(text)

        if text_length == 0:
            return 0

        elif text_length == 1:
            return 1

        else:
            if text[0] == text[-1]:
                memory[text] = 2 + computeLongestPalindrome(text[1:-1])
            else:
                memory[text] = max([
                    computeLongestPalindrome(text[:-1]), 
                    computeLongestPalindrome(text[1:])
                ])
            return memory[text]

약간만 긴 string으로 두 버전을 테스트해보면 어마어마한 속도차이를 체감할 수 있을 것이다.